ES6中引入的第7种全新的数据类型
Symbol
,表示独一无二的值。
-
Symbol值是通过Symbol函数生成。也就是说,对象的属性名可以有两种类型
- 一种是原来的字符串类型
String
- 一种是新增的
Symbol
数据类型
- 一种是原来的字符串类型
-
只要属性名属于
Symbol
类型,就是独一无二的,可以保证不会与其他的属性名字产生冲突。个人感觉还是非常有用的。-
var zwSymbol = Symbol(); // 写法一 : var a = {}; a[zwSymbol] = 'ziwen' // 写法二 : var a = { [zwSymbol]: 'ziwen' } // 写法三 : var a = {}; Object.defineProperty(a, zwSymbol, {value: 'ziwen'}) // 这三种方法都可以得到相同的结果 a[zwSymbol] // 'ziwen'
- **注意:`Symbol`值作为对象属性名时不能使用点运算符。** ``` var z = Symbol(); var obj = { [z]: function(args){ console.log(args) } } 或者写成: var obj = { [z](args){ console.log(args) } } obj[z]('测试') // 测试 ``` - 如果 z 不不放在方括号中的话,该属性的键名就是字符串z,而不是z所代表的`Symbol`值
-
-
Symbol
不能使用new
命令,因为Symbol
不是对象,是一种原始数据类型。 -
如果Symbol的参数是一个对象,就会调用该对象的
toString
方法,将其转换成字符串,然后才生成一个Symbol
值。 -
Symbol
函数的参数只表示对当前Symbol
值的描述,因此相同参数的Symbol
函数的返回值是不同的。-
var t1 = Symbol('test'); var t2 = Symbol('test'); var t3 = Symbol(); var t4 = Symbol(); t1 === t2 // false t3 === t4 // false
-
-
Symbol
作为属性名时,该属性不会出现在for...in
、for...of
循环中,也不会被Object.keys()
、Object.getOwnPropertyNames()
返回。但她不是私有属性,有一个Object.getOwnPropertySymbols()
方法可以获取指定对象的所有Symbol属性名。Object.getOwnPropertySymbols()
方法返回一个数组,成员是当前对象的所有用作属性名的Symbol
值。 -
Symbol.for()与Symbol.keyFor()
-
Symbol.for()
接收一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值
,否则就新建并返回一个以该字符串为名称的Symbol
值。 -
Symbol.for()
为Symbol
值登记的名字是全局环境的,可以在不同的iframe
或service worker
中得到同一个值。 -
Symbol.keyFor()
方法返回一个已登记的Symbol
类型值的key
var z = Symbol.for("zw"); Symbol.keyFor(z) // "zw" var w = Symbol("zw"); Symbol.keyFor(w); // undefined 变量 w 属于未登记的Symbol值,所以返回undefined
-