概述
Symbol是es6引入的一种新的原始数据类型,表示独一无二的值 ,是属于js语言的原生数据类型之一。
若你想创建一个新的方法,为了防止与其他方法撞名称,那么可以使用Symbol , 保证每一个属性名都是独一无二的,从根本上防止命名冲突问题
这样我们就可以使用symbol来创建
symbol()创建的 是symbol类型的,是一种类似字符串的数据类型 ; 所以symbol值不能添加属性
symbol实例的描述
给symbol一个字符串作为它的参数,就表示对 symbol实例的描述,主要作用是在控制台显示,比较容易区分
symbol函数的参数只是对当前Symbol值的描述,所以相同参数的 Symbol函数的返回值是不一样的。
除了可以使用转为字符串的形式返回Symbol实例,还可以使用Symbol.prototype.description 来返回
Symbol.prototype.description
返回Symbol实例的描述
提供了一个实例属性 description , 直接返回Symbol
Symbol值无法计算
Symbol值的转换
Symbol值可以显示转化为字符串格式
String(变量名)
变量名.toString()
Symbol值可以转为boolean类型
Symbol值不能转为 Number类型
作为属性名的Symbol
因为每一个Symbol的值都是独一无二的,所以他们可以当作标识符,用于对象的属性名,这样就后期就不会被覆盖掉了
1、给对象添加进去
2、在对象里面的属性名就使用 Symbol
3、使用 Object.defineProperty
注:Symbol值作为对象属性名的时候,不能用 . 来添加
也就是说,使用 若使用 . 来添加属性的话,则不会把它看成Symbol类型的值,而是看成一个字符串形式的。
若想看成 Symbol类型的,则必须要 用 [] 包裹起来
那么访问的时候
连起来声明
属性名的遍历
Symbol是一个公有属性
Object.getOwnPropertySymbols()
可以获取指定对象的所有Symbol属性名 (注:只返回所有Symbol值的)
Reflect.ownKeys()
可以返回所有类型的属性名
Symbol.for() 和 Symbol.keyFor()
Symbol.for()
目的 : 使用同一个Symbol值
s1和s2都是Symbol值,且都是有 同样参数的Symbol.for方法生成的 , 所以实际是同一个值
与Symbol区别
Symbol和Symbol.for 都会生成新的Symbol值,
不过Symbol 每次调用就生成一个新的Symbol类型的值,
Symbol.for 是先去查找 key是否已经存在,不存在再新建一个新的值。且 Symbol.for() 会被登记在全局环境中 供搜索。
Symbol.keyFor()
返回一个已经登记的Symbol类型值的key
而Symbol创建的就没有,因为它不会被登记在全局环境下
时刻注意 : 用Symbol.for() 生成的 Symbol值是登记在全局环境下的
Symbol内置的值
Symbol还有11个内置的值,指向语言内部使用的方法。