Symbol

97 阅读3分钟

背景

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

该属性指向一个方法。对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。参数为一个字符串参数,表示当前的运算模式。可选的参数有 NumberStringDefault

10. Symbol.toStringTag

该属性指向一个方法。对象上面调用 Object.prototype.toString 方法时,如果这个属性存在,它的返回值会出现在 toString 方法返回的字符串之中,表示对象的类型。

11. Symbol.unscopables

该属性指向一个对象。对象指定了使用 with 关键字时,哪些属性会被 with 环境排除。

以上就是 Symbol 的基本特性和内置属性的简要解释。Symbol 提供了一种唯一且不可变的数据类型,用于创建唯一的属性 key,防止冲突和修改。在实际开发中,Symbol 经常用于创建私有属性或特定用途的属性,增加了代码的可读性和安全性。