返回

JavaScript 中 Symbol 的应用场景与使用方法

前端

ES6 中引入了一种新的基本数据类型:Symbol,它代表着一种唯一性、不可伪造的值。Symbol 值可以作为对象属性的键名,也可以作为函数的属性名。

一、创建和使用 Symbol

创建一个 Symbol 值可以使用 Symbol() 函数。例如:

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

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

Symbol 值是唯一的,即使两个 Symbol 值的相同,它们也是不相等的。

Symbol 值可以用作对象属性的键名。例如:

const person = {
  name: 'John Doe',
  [symbol1]: 'secret data'
};

console.log(person[symbol1]); // "secret data"

Symbol 值也可以用作函数的属性名。例如:

const func = {
  [symbol1]() {
    console.log('Hello, world!');
  }
};

func[symbol1](); // "Hello, world!"

二、Symbol 的常见应用场景

Symbol 有很多常见的应用场景,包括:

  • 作为对象属性的键名 :Symbol 值可以作为对象属性的键名,这可以防止属性名冲突。例如,以下代码使用 Symbol 值作为对象属性的键名:
const person = {
  name: 'John Doe',
  [Symbol('age')]: 30
};

console.log(person[Symbol('age')]); // 30
  • 作为函数的属性名 :Symbol 值也可以作为函数的属性名。这可以防止函数名冲突。例如,以下代码使用 Symbol 值作为函数的属性名:
const func = {
  [Symbol('sayHello')]() {
    console.log('Hello, world!');
  }
};

func[Symbol('sayHello')](); // "Hello, world!"
  • 作为迭代器 :Symbol 值可以作为迭代器的属性名。这可以防止迭代器属性名冲突。例如,以下代码使用 Symbol 值作为迭代器的属性名:
const iterable = {
  [Symbol.iterator]() {
    let i = 0;
    return {
      next() {
        if (i < 10) {
          return { value: i++, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

for (const num of iterable) {
  console.log(num); // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
}
  • 作为符 :Symbol 值可以作为描述符的属性名。这可以防止描述符属性名冲突。例如,以下代码使用 Symbol 值作为描述符的属性名:
const descriptor = {
  [Symbol('configurable')]: true,
  [Symbol('enumerable')]: false,
  [Symbol('writable')]: true,
  value: 'Hello, world!'
};

Object.defineProperty(obj, 'message', descriptor);

console.log(obj.message); // "Hello, world!"

三、Symbol 的注意事项

在使用 Symbol 时,需要注意以下几点:

  • Symbol 值是唯一的,即使两个 Symbol 值的描述相同,它们也是不相等的。
  • Symbol 值不能用作变量名、函数名或对象属性名。
  • Symbol 值只能用作对象属性的键名、函数的属性名、迭代器的属性名或描述符的属性名。
  • Symbol 值不能被序列化或反序列化。
  • Symbol 值不能被继承。