返回

ES6 Symbol 类型:揭开神秘面纱,赋予数据独一无二的身份标识

前端

在 ES6 之前,JavaScript 中只有六种基本的数据类型:字符串、数字、布尔值、数组、对象和 undefined。ES6 引入了第七种基本数据类型 —— Symbol,它可以用来表示唯一的值,而且这些值不能被重写或重新声明。


1. Symbol.for 的使用:创建并注册全局 Symbol 值

Symbol.for() 方法用于创建一个全局 Symbol 值,如果这个值已经存在,则返回已有的 Symbol 值。这意味着使用 Symbol.for() 创建的 Symbol 值是唯一的,并且在整个程序中都是相同的。

const symbol1 = Symbol.for("mySymbol");
const symbol2 = Symbol.for("mySymbol");

console.log(symbol1 === symbol2); // true

在上面的代码中,symbol1 和 symbol2 使用 Symbol.for() 方法创建,并且它们的值相同,因为它们都表示同一个全局 Symbol 值。


2. Symbol 的使用场景:赋予数据独一无二的标识

Symbol 类型最常用于创建私有属性或方法。私有属性或方法是指只能在创建它们的类或对象中访问的属性或方法。在 ES6 之前,通常使用下划线 (_) 前缀来表示私有属性或方法,但这并不是真正的私有,因为它们仍然可以通过原型链访问。

使用 Symbol 创建的私有属性或方法是真正的私有,因为它们不会被添加到对象的原型链上。这意味着它们只能在创建它们的类或对象中访问。

class MyClass {
  #privateProperty = "This is a private property";

  #privateMethod() {
    console.log(this.#privateProperty);
  }

  publicMethod() {
    this.#privateMethod();
  }
}

const instance = new MyClass();

console.log(instance.#privateProperty); // error
instance.publicMethod(); // "This is a private property"

在上面的代码中,#privateProperty 和 #privateMethod 是私有属性和方法,只能在 MyClass 类中访问。publicMethod() 方法可以访问私有属性和方法,因为它是 MyClass 类的一部分。


3. 内置的一些系统 Symbol:赋予内置对象更多灵活性

除了创建私有属性或方法外,Symbol 类型还可以用于创建内置对象的属性或方法。这些属性或方法被称为系统 Symbol,它们可以用来扩展内置对象的functionality。

以下是一些内置的系统 Symbol:

  • Symbol.iterator:表示对象的默认迭代器。
  • Symbol.hasInstance:检查对象是否属于某个类。
  • Symbol.isConcatSpreadable:指示对象是否可以被展开为数组。
  • Symbol.match:表示正则表达式的匹配结果。
  • Symbol.replace:表示正则表达式的替换结果。
  • Symbol.search:表示正则表达式的搜索结果。
  • Symbol.species:表示对象的构造函数。
  • Symbol.toPrimitive:表示对象的原始值。
  • Symbol.toStringTag:表示对象的类名。

系统 Symbol 可以用来扩展内置对象的 functionbility,使它们能够执行更多操作。例如,使用 Symbol.iterator 可以让对象具有可迭代性,使用 Symbol.hasInstance 可以让类具有 instanceof 操作符。