新的原始数据类型 :表示独一无二的值
- 创建方式一
var name1 = Symbol() // 不传入任何值
- 创建方式二
var age1 = Symbol('age') // 传入key值增强代码阅读性
据以上2种创建方式我们来看看它是怎么独一无二的
var name1 = Symbol()
var name2 = Symbol()
name1 === name2 // false
var age1 = Symbol('age')
var age2 = Symbol('age')
age1 === age2 //false
作为对象的属性
基于Symbol独一无二的特点,我们可以将其用于创建对象的属性,尤其当一个对象由多个人修改时,很容易造成重名,Symbol可以解决这种冲突。
// 方式一
var name1 = Symbol('name')
var obj = {
[name]: 'obj'
}
// 方式二
var name1 = Symbol('name')
var obj = {}
obj[name] = 'obj'
// 方式三
var name1 = Symbol('name')
var obj = {}
Object.defineProperty(obj, name1, {
value: 'obj'
})
// 以上写法都得到同样结果
obj[name1] // "obj!"
遍历对象的属性
var name1 = Symbol('name')
var obj = {
[name1]: 'obj',
age: 12
}
Object.getOwnPropertyNames(obj) // ['age'], 拿不到Symbol定义的属性
Object.getOwnPropertySymbols(obj) // [Symbol(name)] ,拿不到普通的属性
Reflect.ownKeys(obj) // ["age", Symbol(name)]
访问对象属性
var obj = {
[Symbol('name')]: 'obj',
age: 12
}
obj['age'] // 12
obj[Symbol('name')] // 访问不到
因此,做封装时可将Symbol创建的属性作为私有属性,避免暴露出去。
for和keyFor
如果我们希望使用同一个Symbol值怎么办?
- 创建方式三: 使用for创建全局Symbol
var s1 = Symbol.for('name')
var s2 = Symbol.for('name')
s1 === s2 // true, 无论使用多少次 Symbol.for('name'),返回的都是同一个
Symbol.keyFor(s1) // name
Symbol.keyFor(s2) // name
// 使用keyFor获取描述
注意:
其他内置属性
参考http://es6.ruanyifeng.com/#docs/symbol
另附: