随着 JavaScript 的普及和发展,ES6 带来了很多新的语言特性和 API,Symbol 类型就是其中一个。Symbol 是 JavaScript 的新原始数据类型,它的出现补充了 JavaScript 中原始类型的不足,为前端开发带来了更多功能和优化。
Symbol 类型的定义
在 JavaScript 中,Symbol 是一种新的原始数据类型,它的定义方式如下:
let s = Symbol();
Symbol 函数返回一个独一无二的值,它不能使用 new 来创建,这也是 Symbol 与其他 JavaScript 数据类型的最大不同之处。每个 Symbol 值都是唯一的,即使我们传递相同的参数,也不会返回相同的结果。
Symbol 类型的作用
有了 Symbol 类型,我们可以在 JavaScript 中实现更复杂的数据类型和数据结构,具体来说,Symbol 主要有以下几个作用:
创建对象的私有属性
在 JavaScript 中,我们可以给对象添加属性,但是这些属性都是公开的,不能够被保护。有了 Symbol 类型之后,我们就可以创建对象的私有属性,这些属性不会在对象的 for...in 循环和 JSON 序列化中被输出。
let name = Symbol('name'); let person = { [name]: 'Tom' }; console.log(person[name]); //Tom for(let key in person){ console.log(key); //空 }
防止属性名冲突
在 JavaScript 中,我们经常会遇到属性名冲突的问题,有了 Symbol 类型之后,我们可以使用不同的 Symbol 值来表示不同的属性名,从而避免冲突。
let name1 = Symbol('name'); let name2 = Symbol('name'); let person = { [name1]: 'Tom', [name2]: 'Jerry' }; console.log(person[name1]); //Tom console.log(person[name2]); //Jerry
定义常量
在 JavaScript 中,我们经常需要定义常量来表示一些固定的值,只不过 JavaScript 中没有专门的语法来定义常量,但是 Symbol 可以让我们用类似常量的方式来定义一个不可改变的值。
const MY_SYMBOL = Symbol('my_symbol');
这样,我们就定义了一个不可修改的 MY_SYMBOL 常量。
Symbol 类型的一些重要特性
Symbol 属性的遍历
在 JavaScript 中,对象的属性分为两种:可枚举和不可枚举。对于 Symbol 属性,它们默认是不可枚举的。
let name1 = Symbol('name'); let name2 = Symbol('name'); let person = { [name1]: 'Tom', [name2]: 'Jerry' }; console.log(Object.getOwnPropertyNames(person)); //[] console.log(Object.getOwnPropertySymbols(person)); //[Symbol(name), Symbol(name)]
Symbol.for 和 Symbol.keyFor
Symbol.for() 方法会根据传入的字符串,返回一个已经定义过的 Symbol 值,如果不存在,则创建一个新的 Symbol 值。
let s1 = Symbol.for('foo'); let s2 = Symbol.for('foo'); console.log(s1 === s2); //true
Symbol.keyFor() 方法可以通过 Symbol 值获取到对应的字符串。
let s3 = Symbol.for('foo'); let s4 = Symbol('foo'); console.log(Symbol.keyFor(s3)); //foo console.log(Symbol.keyFor(s4)); //undefined
总结
Symbol 是 JavaScript 的新原始数据类型,它的出现补充了 JavaScript 中原始类型的不足,为前端开发带来了更多功能和优化。Symbol 可以用来创建对象的私有属性,防止属性名冲突,定义常量等,还有一些重要特性,如遍历 Symbol 属性、Symbol.for() 和 Symbol.keyFor()。在实际的开发中,我们需要根据自己的需求来合理使用 Symbol 类型,从而优化程序的性能和功能。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6535bb527d4982a6ebd4026a