Symbol的特点
symbol定义的对象属性通过object.key(object)得不到键名,使用for…in也拿不到,但可以通过反射键API得到。reflect.ownKey(obj)就可以得到symbol类型的键名。
通常定义方式:let name=symbol()
扩展定义方式:let name=symbol.for(“描述性语言”)
根据symbol的特点可以有以下使用场景:
(1)因为symbol是一种类型,那么就可以用来定义对象的属性名
const name=Symbol()
const age=Symbol()
let obj=
{
[name]:“zhang san”
}
obj[age]=20
console.log(obj[name]); // zhangsan
console.log(obj[age]); // 20
(2)可以用来代替常量const。
可能比较迷惑,有const了为什么还要用Symbol代替。
const在定义多个常量,且需要多个常量之间毫无关系,就需要给每个常量赋值,且为了程序的可读性,每个值需要有不同的意义。
这个时候就可以用symbol()声明变量,不用赋初值,每个变量也会毫无关系。
(3)可以用来存储比较保密的方法和属性
在写不想公开的方法和属性时,我们可以在一个JS文件中用Symbol()来定义类的属性,方法,在另一个js文件中进行传值就可以,但不可以访问。
由于外文件不可以访问到symbol()定义的属性,如果多个window窗口想要使用同一个symbol定义的属性就不能实现。此时可以用symbol.for()进行定义多个属性,但实质上指向同一个。
练习: