背景
JavaScript 中的对象属性 key 默认是字符串,可能会被无意间修改。为了解决这个问题,ES6 引入了 Symbol 数据类型,它是一种新的原始数据类型,用于表示唯一的、不可变的值。
特性
- Symbol 生成的值是唯一的,不会与其他值相等。
- 使用 Symbol 时不需要使用
new关键字。 - 可以为 Symbol 添加一个描述性质的字符串参数,用于调试和描述。
使用的 API
1. Symbol()
生成的结果是不加入登记的,意味着每一次生成的都是新的 Symbol 值。
2. Symbol.for('e')
将 Symbol 值加入登记,返回一个已经登记的 Symbol。Symbol 值登记的名字,是全局环境的。
3. Symbol.keyFor('e')
获取已经登记的 Symbol 值的名字,如果没有获取到已经登记的 Symbol,则返回 undefined。
内置 Symbol 值
这些 Symbol 属性都是定义在对象上。
1. Symbol.hasInstance
当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法。
2. Symbol.isConcatSpreadable
该属性是一个布尔值,表示该对象用于 Array.prototype.concat() 时,指定的数组是否可以展开。默认值是 undefined,当值为 true 时可以展开。
3. Symbol.species
该属性指向一个构造函数。实例对象在运行过程中,需要再次调用自身的构造函数时,会调用该属性指定的构造函数。
4. Symbol.match
该属性指向一个函数。当执行 str.match(myObject) 时,如果该属性存在,会调用它,返回该方法的返回值。
5. Symbol.replace
该属性指向一个方法。当该对象被 String.prototype.replace 方法调用时,会返回该方法的返回值。参数为第一个参数是作用的对象,第二个参数是替换后的值。
6. Symbol.search
该属性指向一个方法。对象被 String.prototype.search 方法调用时,会返回该方法的返回值。参数为调用的字符串。
7. Symbol.split
该属性指向一个方法。对象被 String.prototype.split 方法调用时,会返回该方法的返回值。参数为调用的字符串。
8. Symbol.iterator
该属性指向该对象的默认遍历器方法。
9. Symbol.isPrimitive
该属性指向一个方法。对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。参数为一个字符串参数,表示当前的运算模式。可选的参数有 Number、String 和 Default。
10. Symbol.toStringTag
该属性指向一个方法。对象上面调用 Object.prototype.toString 方法时,如果这个属性存在,它的返回值会出现在 toString 方法返回的字符串之中,表示对象的类型。
11. Symbol.unscopables
该属性指向一个对象。对象指定了使用 with 关键字时,哪些属性会被 with 环境排除。
以上就是 Symbol 的基本特性和内置属性的简要解释。Symbol 提供了一种唯一且不可变的数据类型,用于创建唯一的属性 key,防止冲突和修改。在实际开发中,Symbol 经常用于创建私有属性或特定用途的属性,增加了代码的可读性和安全性。