一、Symbol.for實戰
在JavaScript中,一個Symbol可以表示一個獨一無二的標識符。在ES6中,引入了一個新的方法Symbol.for(),它允許我們通過字符串來獲取Symbol類型的值,如果該字符串不存在,則會新建一個Symbol值。
const mySymbol = Symbol.for('mySymbol'); const anotherSymbol = Symbol.for('mySymbol'); console.log(mySymbol === anotherSymbol); // true
這裡通過兩次調用Symbol.for(‘mySymbol’)分別獲取了兩個Symbol值,但由於它們的參數字符串相同,所以它們是同一個Symbol值。我們可以將Symbol.for()和對象的屬性結合起來使用:
const myObject = { [Symbol.for('name')]: '張三', [Symbol.for('age')]: 18 }; console.log(myObject[Symbol.for('name')]); // 張三 console.log(myObject[Symbol.for('age')]); // 18
在這裡,我們為對象動態添加了兩個Symbol類型的屬性name和age,只能用Symbol.for()來獲取它們的值,這保證了它們是獨一無二的,不會與其他屬性名衝突。
二、Symbol.forget
一旦使用Symbol.for()新建了一個Symbol值,我們就可以通過它來獲取到這個Symbol值了。但在某些情況下,我們可能需要刪除這個Symbol值,也就是將其從全局Symbol註冊表中刪除,這時可以使用Symbol.keyFor()方法來獲取其對應的鍵名並進行刪除。
const mySymbol = Symbol.for('mySymbol'); console.log(Symbol.keyFor(mySymbol)); // 'mySymbol' Symbol.for('mySymbol'); console.log(Symbol.keyFor(mySymbol)); // 'mySymbol' Symbol.for('anotherSymbol'); console.log(Symbol.keyFor(mySymbol)); // undefined
以上代碼中,我們使用Symbol.for()新建了兩個Symbol值,它們的參數值分別為’mySymbol’和’anotherSymbol’。第一次調用Symbol.keyFor()方法可以獲取到參數值為’mySymbol’的Symbol值的鍵名,即’mySymbol’,第二次調用結果仍是’mySymbol’,因為之前已經將其註冊過了,第三次調用後返回undefined,因為我們並沒有從註冊表中獲取到’anotherSymbol’對應的Symbol值。
三、Symbol.for和Symbol
ES6還引入了Symbol()方法來創建Symbol值,這個方法與Symbol.for()很相似,區別在於Symbol()創建的Symbol值是局部可見的,而Symbol.for()創建的Symbol值是全局可見的。
const mySymbol1 = Symbol('mySymbol'); const mySymbol2 = Symbol('mySymbol'); console.log(mySymbol1 === mySymbol2); // false const myGlobalSymbol1 = Symbol.for('mySymbol'); const myGlobalSymbol2 = Symbol.for('mySymbol'); console.log(myGlobalSymbol1 === myGlobalSymbol2); // true
在以上代碼中,我們已經看到了Symbol()和Symbol.for()方法的差別。使用Symbol()創建的Symbol值,在不同的位置上使用相同的參數值,也不能得到同一個Symbol值,它們是完全獨立的。而使用Symbol.for()創建的Symbol值,只要在全局Symbol註冊表中存在同名的Symbol值,就可以得到同一個Symbol值。
四、Symbol作為對象屬性名
在對象字面量中,我們通常使用字符串作為屬性名,但這可能會導致屬性名衝突,因此ES6引入了Symbol類型的屬性名。這種屬性名不會出現在for…in循環、Object.keys()、Object.getOwnPropertyNames()等方法中,也只能通過Object.getOwnPropertySymbols()方法獲取到。
const myObject = { [Symbol.for('name')]: '張三', age: 18 }; console.log(Object.getOwnPropertySymbols(myObject)); // [Symbol(name)]
在以上代碼中,我們可以看到myObject對象中只有一個Symbol類型的屬性名,可以通過Object.getOwnPropertySymbols()方法獲取到這個屬性名。
五、Symbol在枚舉中的應用
枚舉類型是一種常用的數據類型,在ES6之前,我們都是使用對象字面量來實現枚舉:
const Colors = { RED: 0, GREEN: 1, BLUE: 2 }; console.log(Colors.RED); // 0
使用對象字面量可以很方便地實現枚舉,但它有一個缺點:它不能保證枚舉值的唯一性。因此,在ES6中推薦使用Symbol類型來實現枚舉,從而達到保證唯一性的目的。
const Colors = { RED: Symbol('RED'), GREEN: Symbol('GREEN'), BLUE: Symbol('BLUE') }; console.log(Colors.RED); // Symbol(RED)
在以上代碼中,我們使用Symbol()方法創建了三個唯一的Symbol值,用它們來作為枚舉類型的值,從而達到保證唯一性的目的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/253592.html