Symbol是一种通过Symbol函数来生成的独一无二的值,可以作为对象属性名。
在ES6之前,对象的属性都是字符串,在ES6添加了Symbol的基本数据类型之后,就可以使用Symbol作为对象的属性值了。
1.为什么需要使用Symbol?
在ES6之前,对象的属性名都是字符串形式,很容易造成属性名的冲突;
比如原来有一个对象,我们希望在其中添加一个新的属性和值,但是我们在不确定它原来内部有什么内容的情况下,很容易造成冲突,从而覆盖掉它内部的某个属性;
Symbol就是为了解决上面的问题,来生成一个独一无二的值。
- Symbol值是通过Symbol函数来生成的,生成后可以作为属性名;
- 在ES6中,对象的属性名可以使用字符串,也可以使用Symbol值。
Symbol即使多次创建值,它们也是不同的:Symbol函数执行后每次创建出来的值都是独一无二的; 我们也可以在创建Symbol值的时候传入一个描述description:这个是ES2019(ES10)新增的特性;
2.Symbol作为属性名
const s1 = Symbol()
const s2 = Symbol("cba")
const obj = {}
//写法一: 属性名赋值
obj[s1] = "abc"
obj[s2] = "cba"
console.log(obj[s1]);
console.log(obj[s2]);
// 写法二: Object.defineProperty
Object.defineProperty(obj, s1, {
enumerable: true,
configurable: true,
writable: true,
value: "abc"
})
// 写法三: 定义字面量是直接使用
const info ={
[s1]: "abc",
[s2]: "cba"
}
3.相同值的Symbol
如果我们想要创建一个值相同的Symbol值怎么做
- 我们可以使用Symbol.for方法来做到这一点;
- 并且我们可以通过Symbol.keyFor方法来获取对应的key。