Symbol是為了解決屬性名沖突的問題而引入的,想要創建不會沖突的屬性,可以new一個Symbol,每個創建的Symbol是獨一無二的,不會沖突
var mySymbol = Symbol();
obj[mySymbol] = "ok!"; // called symbol-keyed property, guaranteed not to collide
console.log(obj[mySymbol]); // ok!
可以創建具有
description
的Symbol
,description
會在toString
時打印出來symbol-keyed property不能使用點號引用,需要使用方括號引用。
get 和 set symbol keyed property: element[Symbol]
檢查有沒有屬性: if (Symbol in element)
刪除屬性: delete element[Symbol]Symbol 離開作用域,這個屬性就沒法引用了
Object.getOwnPropertyNames
,Object.keys(obj)
不會返回Symbol keyed property。Object.getOwnPropertySymbols(obj)
返回symbol-keyed property。
Symbol是單獨的類型,Symbol不會自動轉換成字符串,必須顯示調用toString()
> typeof Symbol()
"symbol"
有三類Symbol
Symbol創建的新的Symbol
Symbol.for(string) 重復返回統一Symbol
標準里定義的Symbol,比如
Symbol.iterator
for (var item of myArray)
就是調用 myArray[Symbol.iterator]()
返回一個迭代器