es6-symbol的用法

littlebirdflying發表於2018-09-18

Symbol資料型別

Synmbol 資料型別提供一個獨一無二的值。

Symbol的宣告

{
  // 宣告
  let a1=Symbol(); // 這裡沒有 new
  let a2=Symbol();
  console.log(a1===a2); // false
  let a3=Symbol.for('a3'); // 返回由給定的 key 找到的 symbol,否則就是返回新建立的 symbol
  let a4=Symbol.for('a3');
  console.log(a3, a4, a3===a4); // Symbol(a3) Symbol(a3) true
}
複製程式碼

Symbol的使用

根據規範,物件屬性鍵只能是string型別或symbol型別,不能是number、boolean,只有string和symbol兩種型別。

{
  let a1=Symbol.for('abc');
  let obj={
    [a1]:'123', 
    'abc':345,
    'c':456
  };
  console.log('obj',obj); // {abc: 345, c: 456, Symbol(abc): "123"}
  // 注意:物件中,symbol 做屬性值,通過 for in 和 for of 拿不到屬性值
  for(let [key,value] of Object.entries(obj)){
    console.log('let of',key,value); // abc 345 // c 456
  }

  Object.getOwnPropertySymbols(obj).forEach(function(item){ // api 結果是陣列
    console.log(obj[item]); // 123
  })

  Reflect.ownKeys(obj).forEach(function(item){ // api 返回陣列包含symbol和非symbol
    console.log('ownkeys',item,obj[item]); // abc 345 c 456 Symbol(abc) 123
  })
}
複製程式碼