10-学习TypeScript(symbol)

195 阅读1分钟

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) ]