返回
Symbol知识点拾遗
前端
2024-01-18 22:52:15
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可以提高代码的可读性和可维护性。