32、es6 -- Symbol

29 阅读2分钟

概述

Symbol是es6引入的一种新的原始数据类型,表示独一无二的值 ,是属于js语言的原生数据类型之一。

若你想创建一个新的方法,为了防止与其他方法撞名称,那么可以使用Symbol , 保证每一个属性名都是独一无二的,从根本上防止命名冲突问题

image.png

这样我们就可以使用symbol来创建

image.png

symbol()创建的 是symbol类型的,是一种类似字符串的数据类型 ; 所以symbol值不能添加属性

symbol实例的描述

给symbol一个字符串作为它的参数,就表示对 symbol实例的描述,主要作用是在控制台显示,比较容易区分

image.png

symbol函数的参数只是对当前Symbol值的描述,所以相同参数的 Symbol函数的返回值是不一样的。

image.png

除了可以使用转为字符串的形式返回Symbol实例,还可以使用Symbol.prototype.description 来返回

Symbol.prototype.description

返回Symbol实例的描述

提供了一个实例属性 description , 直接返回Symbol

image.png

Symbol值无法计算

image.png

image.png

Symbol值的转换

Symbol值可以显示转化为字符串格式

String(变量名)
变量名.toString()

image.png

Symbol值可以转为boolean类型

image.png

Symbol值不能转为 Number类型

image.png

image.png

作为属性名的Symbol

因为每一个Symbol的值都是独一无二的,所以他们可以当作标识符,用于对象的属性名,这样就后期就不会被覆盖掉了

1、给对象添加进去

image.png

2、在对象里面的属性名就使用 Symbol

image.png

3、使用 Object.defineProperty

image.png

注:Symbol值作为对象属性名的时候,不能用 . 来添加

image.png

image.png

也就是说,使用 若使用 . 来添加属性的话,则不会把它看成Symbol类型的值,而是看成一个字符串形式的。 

若想看成 Symbol类型的,则必须要 用 [] 包裹起来

那么访问的时候

image.png

连起来声明

image.png

属性名的遍历

Symbol是一个公有属性

Object.getOwnPropertySymbols()

可以获取指定对象的所有Symbol属性名 (注:只返回所有Symbol值的)

image.png

image.png

Reflect.ownKeys()

可以返回所有类型的属性名

image.png

image.png

Symbol.for() 和 Symbol.keyFor()

Symbol.for()

目的 : 使用同一个Symbol值

image.png

s1和s2都是Symbol值,且都是有 同样参数的Symbol.for方法生成的 , 所以实际是同一个值

与Symbol区别

Symbol和Symbol.for 都会生成新的Symbol值,

不过Symbol 每次调用就生成一个新的Symbol类型的值,

Symbol.for 是先去查找 key是否已经存在,不存在再新建一个新的值。且 Symbol.for() 会被登记在全局环境中 供搜索。

Symbol.keyFor()

返回一个已经登记的Symbol类型值的key

image.png

而Symbol创建的就没有,因为它不会被登记在全局环境下

image.png

时刻注意 : 用Symbol.for() 生成的 Symbol值是登记在全局环境下

image.png

Symbol内置的值

Symbol还有11个内置的值,指向语言内部使用的方法。