📜  JavaScript中的symbol(1)

📅  最后修改于: 2023-12-03 15:16:17.005000             🧑  作者: Mango

JavaScript中的Symbol

在ES6中引入了Symbol这个新的基本数据类型。Symbol是表示唯一标识符的一种新的方式。它可以用来创建对象的私有成员,也可以作为对象属性的键。本文将介绍Symbol的特性、使用方式和一些注意点。

特性
Symbol的唯一性

每个Symbol实例都是唯一的。

const a = Symbol();
const b = Symbol();
console.log(a === b); // false
Symbol作为对象属性的键

使用Symbol作为对象属性的键可以避免键名冲突,同时使对象更加清晰。

const obj = {
  [Symbol("foo")]: "bar"
};

console.log(obj[Symbol("foo")]); // undefined
console.log(obj[Object.getOwnPropertySymbols(obj)[0]]); // "bar"

在上面代码中,obj对象的foo属性的键是一个Symbol值,并且无法通过其他方式获取到这个键。

内置Symbol常量

JavaScript内置了很多Symbol常量,比如Symbol.toStringTag、Symbol.iterator等。

const arr = [1, 2, 3];
console.log(arr[Symbol.iterator]); // f values() { [native code] }

在上面代码中,arr是一个数组,它的Symbol.iterator属性是一个函数,用来获取数组的迭代器。

使用方式

使用Symbol需要调用Symbol构造函数,传一个参数表示Symbol的描述,描述可以用于调试。

const a = Symbol("description");
console.log(a); // Symbol(description)

Symbol也可以来实现对象的私有属性。

const obj = (function() {
  const privateProperty = Symbol();
  return {
    [privateProperty]: "I'm private",
    publicProperty: "I'm public",
    getPrivateProperty() {
      return this[privateProperty];
    }
  };
})();

console.log(obj.publicProperty); // "I'm public"
console.log(obj.getPrivateProperty()); // "I'm private"

在上面代码中,私有属性privateProperty的键是一个Symbol值,不能通过其他方式获取到,从而实现了对象的私有属性。

注意点
不应使用new关键字

使用new关键字调用Symbol构造函数会抛出TypeError异常。因此,Symbol需要直接调用。

const a = new Symbol(); // TypeError: Symbol is not a constructor
const b = Symbol(); // Works
Symbol不是字符串

Symbol与字符串类似,但它们是不同的数据类型。

const a = Symbol("description");
const b = "Symbol(description)";
console.log(a == b); // false

在上面代码中,Symbol值与字符串值并不相等。

结论

Symbol是一种新的基本数据类型,它具有唯一性、可以作为对象属性的键、内置常量等特性。通过Symbol,我们可以实现对象的私有属性等高级特性。在使用Symbol时需要注意一些细节,如不应调用new关键字、Symbol不是字符串等。