1.理解
是什么?
Symbol
一种原始数据结构
为什么要有它?
表示独一无二的值,最大的用法用来定义对象的唯一属性名
2.使用
注意:symbol是数据类型 而不是对象
定义的时候可以接受一个字符串作为参数 作为标识
let x = Symbol("i am unique");
console.log(x);//Symbol(i am unique)
console.log(typeof x);//Symbol
实际应用场景
作为属性名/定义常量
(1)作为属性名
let x = Symbol("i am unique");
console.log(x);//Symbol(i am unique)
console.log(typeof x);//Symbol
//写法一:
let obj = {};
obj[x] = 'value';
console.log(obj);//{Symbol(i am unique): 'value'}
//写法二:
let obj1 = {
[x]:'value1'
}
console.log(obj1);//{Symbol(i am unique): 'value1'}
//写法三:
let obj2 = {};
Object.defineProperty(obj2,x,{value:'value2'});
console.log(obj2);//{Symbol(i am unique): 'value2'}
(2)定义常量
两个方法:
Symbol.key();
作用:全局搜索是否有有该字符串参数的Symbol值,如果有则返回Symbol值,如果没有则新建返回一个以该字符串为参数的Symbol值,并登记在全局环境中以便后续搜索。
注意区分和Symbol()创建的区别
后者就算字符串参数相同 得到的结果是不一样的 而前者后返回搜索到相同字符串对应的symbol
let s = Symbol();
console.log(s,typeof s);//Symbol() 'symbol'
let s2 = Symbol('Jackson');
let s3 = Symbol('Jackson');
console.log(s2 == s3);//false
//Symbol.for创建 这里的Symbol是个对象
let s4 = Symbol.for();
let s01 = Symbol.for('jack');
let s02 = Symbol.for('jack');
console.log(s01 == s02);//true
Symbol.keyFor();
返回一个已登记的Symbol类型值的key,用来检测字符串参数作为Symbol值是否已被登记(
注意:
Symbol.keyFor()在全局注册表中找,而Symbol()创建的不会放在全局注册表中,每次都是新建,
Symbol()是在全局注册表中搜索 搜索到返回 搜索不到新建之后放在全局注册表中
let yellow1 = Symbol.for("why");
Symbol.keyFor(yellow1); // "Yellow"
console.log(Symbol.keyFor(yellow1));
Symbol属性和方法参考以下文章
参考文章