JavaScript中的Symbol(符號)是一種新的原始數據類型,它可以用來創建唯一的標識符,這些標識符可以作為屬性的鍵來使用。
Symbol類型的值可以通過Symbol()函數來創建:
let sym1 = Symbol(); let sym2 = Symbol('mySymbol');
Symbol()函數每次返回一個全新的、唯一的符號值。如果向Symbol函數傳遞一個字符串參數,則該參數將成為符號的描述。
let sym = Symbol('mySymbol'); console.log(sym) // output: Symbol(mySymbol)
使用符號作為對象屬性的鍵時,可以避免屬性名沖突的問題。例如:
let myObj = { [Symbol('myProp')]: 'Hello' } console.log(myObj) // output: {Symbol(myProp): "Hello"}
當使用Object.keys()或for...in循環訪問對象屬性時,符號鍵是不可見的。但是,我們可以通過Object.getOwnPropertySymbols()方法來獲取所有對象的符號屬性:
console.log(Object.getOwnPropertySymbols(myObj)); // output: [Symbol(myProp)]
除了使用Symbol()函數來創建符號值之外,還可以使用Symbol.for()函數來創建全局符號。當我們傳遞相同的字符串參數時,Symbol.for()將返回相同的符號值。例如:
let sym1 = Symbol.for('mySymbol'); let sym2 = Symbol.for('mySymbol'); console.log(sym1 === sym2); // output: true
使用Symbol.keyFor()方法可以獲取全局符號的描述:
let sym = Symbol.for('mySymbol'); console.log(Symbol.keyFor(sym)); // output: mySymbol
符號還可以用作Iterator(迭代器)對象的鍵值,例如:
let myIterable = {} myIterable[Symbol.iterator] = function* () { yield 1; yield 2; yield 3; }; console.log([...myIterable]); // output: [1, 2, 3]
符號可以用作單例模式的實現。例如:
let mySingleton = (() => { let instance; function createInstance() { let object = new Object('I am the instance'); return object; } return { getInstance: function() { if(!instance) { instance = createInstance(); } return instance; } } })(); let instance1 = mySingleton.getInstance(); let instance2 = mySingleton.getInstance(); console.log(instance1 === instance2); // output: true
上一篇css樣式li居中對齊
下一篇css打印樣式的顏色