Symbol
- ES6引入了一种新的原始数据类型
Symbol
,表示独一无二的值。 - JS数据类型有:
undefined
,null
,布尔值,字符串,数值,对象,Symbol
; Symbol
值通过Symbol
函数生成:let s = Symbol(); s // Symbol() typeof s // "symbol"
Symbol
函数前不能使用new
命令,会报错;Symbol
函数可以接受一个字符串作为参数,表示对Symbol
实例的描述。
注意:Symbol
函数的参数只是表示对当前Symbol
值得描述,因此相同参数的Symbol
函数的返回值是不相等的。let s = Symbol('abc'); s // Symbol(abc) s.toString() // "Symbol(abc)"
- 如果
Symbol
的参数是一个对象,就会调用该对象的toString
方法,将其转为字符串,然后才生成一个Symbol
值 - 注意:
Symbol
值不能与其他类型的值进行运算,会报错;Symbol
值可以显式转为字符串Symbol
值也可以转为布尔值,但是不能转为数值
Symbol.prototype.description
-
ES2019提供了一个实例属性
description
,直接返回Symbol
的描述const s = Symbol('foo'); s.description // "foo"
-
Symbol
可以作为属性名let s = Symbol(); // 写法一: let a = {}; a[s] = 'abc'; // 写法二: let a = { [s]:'abc' }; // 写法三: let a = {}; Object.defineProperty(a,s,{value:'abc'}); // 以上写法都得到同样的结果 a[s] // "abc"
注意:
Symbol
值作为对象属性名的时候,不能用点运算符- 常量使用
Symbol
值最大的好处是其他任何值都不可能有相同的值了 Symbol
值作为属性名时,该属性是公开属性,不是私有属性
实例:消除魔术字字符串
属性名的遍历
Symbol
作为属性名,遍历对象的时候,该属性不会出现在for...in
,for...of
循环中,也不会被Object.keys()
,Object.getOwnPropertyNames()
,JSON.stringify()
返回。
有一个Object.getOwnPropertySymbols()
方法,可以获取指定对象的所有Symbol
属性名。该方法返回一个数组,成员是当前对象的所有作用属性名的Symbol
值。
Symbol.for()
, Symbol.keyFor()
实例:模块的Singleton
模式
内置的Symbol
值
Symbol.hasInstance
Symbol.isConcatSpreadable
Symbol.species
Symbol.match
Symbol.replace
Symbol.search
Symbol.split
Symbol.iterator
Symbol.toPrimitive
Symbol.toStringTag
Symbol.unscopables