Symbol 作為屬性名時,該屬性不會出現在for...in、for...of迴圈迭代中,也不會在Object.keys()、Object.getOwnPropertyNames()等等之類的方法中被獲取,只有唯一使用Object.getOwnPropertySymbols() 此方法才能獲取擁有 Symbol 值的屬性名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
let s1 = Symbol('s1'); let s2 = Symbol('s2'); const obj = { [s1]: 'Hello', [s2]: 'World' };
for (let key in obj) { console.log(key); // 無輸出 }
let propertyNames = Object.getOwnPropertyNames(obj); console.log(propertyNames); // []
let propertySymbols = Object.getOwnPropertySymbols(obj); console.log(propertySymbols); // [ Symbol(s1), Symbol(s2) ]
應用:
Symbol 屬性不會被常規方法獲取,適合用在定義物件類別(class)中的非私有的、但又希望只用於內部的方法
Symbol.for() & Symbol.keyFor()
Symbol.for(): 可以重新使用同一個 Symbol 值,若定義時輸入參數一樣,則 Symbol 值會相等
Symbol.keyFor(): 可以取得在使用Symbol.for()定義時所輸入的參數值
使用此 2 個函數方法來重複利用資源
1 2 3 4 5 6 7 8 9 10
let s1 = Symbol.for('new'); let s2 = Symbol.for('new');