symbol(新的原生类型)
symbol类型的值是通过Symbol构造函数创建的
let sym = Symbol()
let sym1 = Symbol('key') //key是可选的
symbol值是唯一的
let sym2 = Symbol('2')
let sym3 = Symbol('3')
console.log(sym2 == sym3) //false
和字符串一样,可被用作key值
let symObj = {
[sym1]:'1', //注意这里必须加[]
[sym2]:true,
'name':'lisi',
sex:'nv'
}
console.log(symObj[sym1]) //1
console.log(symObj['name']) //lisi
console.log(symObj['sex'])//nv
console.log(sym1) //Symbol(key)
放在数组中symbol可遍历出来
let symArr = [sym,sym1, 1,'3',true]
for(let i of symArr){
// console.log(i) //symbol是可以被遍历出来的 //
}
for of 不能用做遍历symbol
for(let i of symObj){ } 报错
//类型“{ [x: symbol]: string | boolean; name: string; sex: string; }”必须具有返回迭代器的 "[Symbol.iterator]()" 方法
通过以下方式都取不到symbol值
for in 可以遍历symbol 但是symbol类型的key遍历不出来
for(let i in symObj){
console.log(i) // name sex
}
console.log(Object.keys(symObj)) //[ 'name', 'sex' ]
console.log(Object.getOwnPropertyNames(symObj))//[ 'name', 'sex' ]
console.log(JSON.stringify(symObj)) //{"name":"lisi","sex":"nv"}
通过以下方式取symbol的方式
console.log(Object.getOwnPropertySymbols(symObj)) //[ Symbol(key), Symbol(2) ]
console.log(Reflect.ownKeys(symObj)) // [ 'name', 'sex', Symbol(key), Symbol(2) ]