每天做个总结吧,坚持就是胜利!
/**
@date 2021-06-07
@description Symbol小结
*/
壹(序)
在JavaScript中进行对象引用时很容易冲突,因为属性名是字符串,稍不注意就声明了相同字符串的属性;所以ES6引入了一个新的数据类型Symbol,用来表示独一无二的值,就不会担心再出现这种问题。
贰(声明使用)
Symbol只能使用Symbol()函数进行声明,可以传入可选参数description(String),用来描述这个Symbol;
因为Symbol是表示独一无二,所以两个看起来一样的Symbol,其实是不相等的;
const symbol1 = Symbol('test');
const symbol2 = Symbol('test');
symbol1 === symbol2; // false
叁(注意点)
Symbol没有构造函数,所以无法使用new;
new Symbol(); // Uncaught TypeError: Symbol is not a constructor
- 想要使用同一个
Symbol值时,使用Symbol.for()进行Symbol值的声明与获取;
// 声明
const sym1 = Symbol.for('test');
// 获取
const sym2 = Symbol.for('test');
sym1 === sym2; // true
- 使用
Symbol.keyFor()可以获取使用Symbol.for()在全局注册的Symbol的描述值,必传需要查找键值的某个Symbol参数。
Symbol.keyFor(sym3); // "test"
- 使用
Object.getOwnPropertySymbols获取对象中所有自身的Symbol属性的数组;类似于Object.getOwnPropertyNames;
const obj = {};
obj[Symbol('a')] = 1;
obj[Symbol('b')] = 2;
Object.getOwnPropertySymbols(obj); // [Symbol(a), Symbol(b)]
- 给对象声明一个
Symbol属性时,必须使用方括号,因为.的形式属性名是一个字符串;
const obj = {};
const sym = Symbol('a');
obj.sym = 1;
obj; // {sym: 1}
obj[Symbol('a')] = 1;
obj; // {sym: 1, Symbol(a): 1}