问题:我们希望对象的属性名是唯一的,但是对象的属性名都是字符串,我们拿到别人的对象时,可能会想为其增添一个方法,这样可能会与本就存在的方法名起冲突。
解决方案:ES6引入一种新的数据类型,叫Symbol,作为第七种数据类型。
示例:
let s1 = Symbol('bar') // Symbol()函数括号内可以放置对s1的描述
type of s1 // 'symbol'
let s2 = Symbol('bar')
s1 === s2 // false
// 虽然描述都是一样的 但并不相等 每个symbol变量都是独一无二的
上面的代码中:s1由函数Symbol()产生,可见,这里我们没有在前面加new,这是因为Symbol产生的不是对象,而是一种单独的原始类型的值,Symbol类型类似于字符串类型。
应用:
let s1 = Symbol('foo')
let a = {
}
a[s1] = 'hello'
// 或者
let a = {
[s1] : 'hello'
}
let a = {
[s1](arg) {
...
}
}
// 相当于
let a = {
[s1] : function (arg) {
...
}
}
// 调用
a[s1](123)