Symbols(标识符)
Symbol 是一种独特的且不可变的数据类型,经常用来标识对象属性。
要创建 Symbol,输入 Symbol(),并添加一个可选的字符串作为其描述。
const sym1 = Symbol('apple');
console.log(sym1);
Symbol(apple)
它将创建唯一的标识符,并将其存储在 sym1 中。描述 “apple” 只是用来描述标识符的一种方式,但是不能用来访问标识符本身。
为了展示它的工作原理,如果你对具有相同描述的两个标识符进行比较……
const sym2 = Symbol('banana');
const sym3 = Symbol('banana');
console.log(sym2 === sym3);
false
结果是 false,因为描述只是用来描述符号,它并不是标识符本身的一部分。无论描述是什么,每次都创建新的标识符。
当然,依然很难弄明白,所以,我们来看一个之前视频中的示例,看看标识符的作用。下面是代表该示例中的 bowl(碗)的代码。
const bowl = {
'apple': { color: 'red', weight: 136.078 },
'banana': { color: 'yellow', weight: 183.15 },
'orange': { color: 'orange', weight: 170.097 }
};
碗中包含水果,它们是 bowl 的属性对象。但是,当我们添加第二个香蕉时,遇到了问题。
const bowl = {
'apple': { color: 'red', weight: 136.078 },
'banana': { color: 'yellow', weight: 183.151 },
'orange': { color: 'orange', weight: 170.097 },
'banana': { color: 'yellow', weight: 176.845 }
};
console.log(bowl);
Object {apple: Object, banana: Object, orange: Object}
新添加的香蕉将上一个香蕉覆盖了。为了解决该问题,我们可以使用标识符。
const bowl = {
[Symbol('apple')]: { color: 'red', weight: 136.078 },
[Symbol('banana')]: { color: 'yellow', weight: 183.15 },
[Symbol('orange')]: { color: 'orange', weight: 170.097 },
[Symbol('banana')]: { color: 'yellow', weight: 176.845 }
};
console.log(bowl);
Object {Symbol(apple): Object, Symbol(banana): Object, Symbol(orange): Object, Symbol(banana): Object}
通过更改 bowl 的属性并使用标识符,每个属性都是唯一的标识符,第一个香蕉不会被第二个香蕉覆盖。