symbol 这个英文单词表示"唯一" 没错它是javascript新增的基本数据类型,使用symbol来当做属性名,可以有效的防止属性重复,属性值被覆盖
symbol的几种写法
let mySymbol = Symbol()
let a = {}
//第一种写法
a[mySymbol] = 'nihao'
console.log(a[mySymbol])
// 第二种写法
let a = {
[mySymbol]: 'hello'
}
// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'hello'})
获取key值的方法
使用symbol当key的对象,无法使用Object.keys读取到key值, 我们可以使用es6提供的Reflect.ownKeys
// 获取对象的key值
let person = {
name: '大狗',
age: 12,
[Symbol('level')]: 'A'
}
for (const item in person) {
console.log(item) //name age
}
console.log(Object.keys(person)) //['name', 'age']
console.log(Object.getOwnPropertySymbols(person)) //[Symbol(level)]
// es6获取对象key值的新方法
console.log(Reflect.ownKeys(person)) //['name', 'age', Symbol(level)]
symbol
symbol和symbol.for 都具有唯一性,但是他们创建的机制不同,Symbol.for(“foo”)的创建方式会在创建之前在全局中寻找, 有没有用Symbol.for()的方式,并且key是foo的字符串创建了symbol类型(创建了就会在全局中登记), 如果有则不重复创建,直接用已创建的. 然而Symbol(‘foo’) 的创建是不会去检索全局的, 是直接创建一个新的symbol类型, 这也是用symbol(‘foo’ ) 创建的两个Symbol类型不相等的根本原因.
let b1 = Symbol('foo')
let b2 = Symbol('foo')
console.log(b1 === b2) // false
let s1 = Symbol.for('qw')
let s2 = Symbol.for('qw')
console.log(s1 === s2) // true
Symbol.keyFor() 返回一个已登记的Symbol类型值的key
let s1=symbol.for('foo');
Symbol.keyFor(s1) //foo
let s2=Symbol('foo');
Symbol.keyFor(s2) // undefined