概述
ES5的对象属性名都是字符串,这容易造成属性名的冲突。为了能从根本上防止属性名冲突,ES6引入Symbol基本数据类型,表示独一无二的值,它是js语言的第七种数据类型。
Symbol值通过Symbol函数生成。对象的属性名分为两种类型:一种是原来就有的字符串,另一种是新增的Symbol类型,只要属性名属于Symbol类型就是独一无二的,可以保证不会与其他属性名产生冲突。
let s = Symbol()
typeof s // 'symbol'
typeof运算符的结果表明变量s是symbol数据类型,而不是其他类型。
注意:Symbol函数前不能使用new命令,否则报错,因为生成的Symbol是一个基本数据类型,不是对象,它是一种类似于字符串的数据类型。
Symbol函数接受的参数是字符串,如果不是字符串就会被转为字符串,加上参数主要是用于区分不同的Symbol数据。Symbol值不能与其他类型的值进行运算,否则会报错。
作为属性名的Symbol
let mySymbol = Symbol
let a = {}
a[mySymbol] = 'hello'
let b = {
[mySymbol]: 'hello'
}
注意:Symbol值作为对象属性名时不能使用点运算符,因为点运算符后面跟的是字符串,而Symbol值是Symbol数据类型而不是字符串数据类型,同理,在任何地方使用Symbol值都需要加上方括号来表示值为Symbol类型。
Symbol.for()、Symbol.keyFor()
有时我们希望重新使用同一个Symbol值,Symbol.for方法可以做到这一点,它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的Symbol值。如果有就返回这个Symbol值,如果没有就新建并返回一个以该字符串为名称的Symbol值。
let s1 = Symbol.for('foo')
let s2 = Symbol.for('foo')
s1 === s2 // true
Symbol.for和Symbol这两种写法都会生成新的Symbol值,它们的区别是前者会登记在全局环境中供搜索,而后者不会,所以Symbol每次调用都会返回一个不同的值。
Symbol.keyFor方法返回一个已登记的Symbol类型值的key(参数)。
let s1 = Symbol.for('bar')
Symbol.keyFor('s1') // 'bar'
let s2 = Symbol('foo')
Symbol.keyFor('s2') // undefined
总结:Symbol()方法不管参数是不是一样的生成的Symbol值都是不同的,Symbol.for()方法中的参数如果一样那么生成的Symbol值也一样
网友评论