返回

Symbol知识点拾遗

前端

Symbol是ES6新推出的一种基本类型,它表示独一无二的值。Symbol最大的用途是用来定义对象的唯一属性名,例如要给一个已有属性的对象添加一个新的属性,新的属性可能和旧的属性名重复。

Symbol语法

const symbol = Symbol();

用Symbol构造函数来创建Symbol值,如果需要在不同地方创建相等的值,可以传入一个可选的参数,例如:

const symbol1 = Symbol('foo');
const symbol2 = Symbol('foo');
console.log(symbol1 === symbol2); // false

Symbol特点

  • 独一无二: 每个Symbol值都是独一无二的,即使传入相同参数,也不会相等。
  • 不可变: Symbol值一旦创建就不能被修改。
  • 私有属性: Symbol值通常用于对象属性名,可以作为私有属性使用,避免与其他属性冲突。

Symbol应用场景

1. 私有属性

const symbol = Symbol();
const obj = {};
obj[symbol] = '私有属性值';
console.log(obj[symbol]); // 私有属性值

2. 枚举

Symbol值可以用来创建一个私有的枚举:

const colors = {
  RED: Symbol('red'),
  GREEN: Symbol('green'),
  BLUE: Symbol('blue'),
};
console.log(Object.keys(colors)); // []
console.log(Object.getOwnPropertySymbols(colors)); // [Symbol(red), Symbol(green), Symbol(blue)]

3. Map和Set键值

Symbol值可以作为Map和Set的键值,这使得键值独一无二,避免键值冲突。

const map = new Map();
const key1 = Symbol('foo');
const key2 = Symbol('bar');
map.set(key1, 'foo');
map.set(key2, 'bar');
console.log(map.get(key1)); // foo

注意事项

  • Symbol值不能直接作为对象属性名,必须用中括号或Object.defineProperty()方法赋值。
  • Symbol值不能直接用于比较,必须用Symbol.for()方法获取原始值进行比较。
  • Symbol值不能被JSON序列化。

总结

Symbol是ES6中一个强大的数据类型,它可以表示独一无二的值,常用于定义对象的私有属性名、枚举、Map和Set键值。合理使用Symbol可以提高代码的可读性和可维护性。