返回

ES6 Symbol - 专属的唯一值,还是特殊的属性名?

前端

在 ES6 中,Symbol 是一个全新的数据类型。它代表着一种独一无二的值,可以被用来作为对象的属性名,也可以被用来作为函数的参数。

Symbol 的基本用法

创建一个 Symbol 的值非常简单,只需要使用 Symbol() 函数即可。例如:

const symbol1 = Symbol();
const symbol2 = Symbol();

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

由于 Symbol 的值是独一无二的,所以 symbol1 和 symbol2 的值是不同的。

Symbol 的高级用法

除了可以用来创建独一无二的值之外,Symbol 还可以被用来作为对象的属性名。例如:

const person = {
  name: 'John Doe',
  age: 30,
  [Symbol('secret')]: 'This is a secret!'
};

console.log(person.secret); // undefined

由于 Symbol 的属性名是独一无二的,所以 person.secret 的值为 undefined。

Symbol 还可以被用来作为函数的参数。例如:

function greet(name) {
  console.log(`Hello, ${name}!`);
}

greet(Symbol('John Doe')); // TypeError: Cannot convert a Symbol value to a string

由于 Symbol 的值是不能被转换为字符串的,所以 greet(Symbol('John Doe')) 会抛出一个 TypeError 异常。

内置的 Symbol 值

ES6 中还定义了一些内置的 Symbol 值。这些 Symbol 值可以被用来代表一些特殊的功能。例如:

  • Symbol.iterator:代表对象的迭代器方法。
  • Symbol.toStringTag:代表对象的默认字符串表示形式。
  • Symbol.hasInstance:代表对象的 hasInstance() 方法。

这些内置的 Symbol 值可以被用来简化一些操作。例如,我们可以使用 Symbol.iterator 来获取对象的迭代器方法,如下所示:

const person = {
  name: 'John Doe',
  age: 30,
  [Symbol.iterator]: function() {
    return {
      next: function() {
        return {
          value: this.name,
          done: false
        };
      }
    };
  }
};

for (const property of person) {
  console.log(property); // John Doe
}

结语

Symbol 是 ES6 中一个非常强大的数据类型。它可以被用来创建独一无二的值,也可以被用来作为对象的属性名和函数的参数。内置的 Symbol 值还可以被用来简化一些操作。