Symbol.for的詳細闡述

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 02:16
下一篇 2024-12-14 02:16

相關推薦

  • Python for循環求1到100的積

    Python中的for循環可以方便地遍歷列表、元組、字典等數據類型。本文將以Python for循環求1到100的積為中心,從多個方面進行詳細闡述。 一、for循環語法 Pytho…

    編程 2025-04-29
  • Python使用for循環打印99乘法表用法介紹

    本文介紹如何使用python的for循環語句來打印99乘法表,我們將從需要的基本知識、代碼示例以及一些加強版來詳細講解。 一、基礎知識 在學習如何使用for循環打印99乘法表之前,…

    編程 2025-04-29
  • Python for循環優化

    本文將介紹如何對Python中的for循環進行優化。 一、使用range()代替直接迭代 Python中的for循環本質上是一種迭代操作,可以對列表、元組、集合等數據結構進行遍歷。…

    編程 2025-04-28
  • in和for的用法區別

    對於Python編程中的in和for關鍵詞,我們在實際編碼中很容易混淆。本文將從多個方面詳細闡述它們的用法區別,幫助讀者正確使用in和for。 一、in關鍵詞 in是用來判斷一個元…

    編程 2025-04-28
  • Python遞減for循環代碼的實現

    Python中的for循環可以通過遞減實現,遞減for循環通常用於倒序遍歷列表、字符串等數據結構。在本文中,我們將從多個方面對Python遞減for循環代碼做詳細的闡述,包括實現方…

    編程 2025-04-27
  • Python利用for循環實現三角形的繪製

    Python是一種高級編程語言,也是非常適合初學者學習的一種編程語言。本文將詳細介紹如何利用Python中的for循環來實現三角形的繪製。通過本文的學習,大家可以對Python的基…

    編程 2025-04-27
  • Python for循環items用法介紹

    Python是一種高級語言,具有簡單易學,代碼量少,語法清晰的特點。其中for循環是Python中最常見的循環語句之一,而for循環中的items更是讓我們又愛又恨的語法。下面將從…

    編程 2025-04-27
  • Python中for循環遍歷列表

    本文將全方位詳細介紹Python中for循環遍歷列表的方法和技巧,幫助您更加深入理解並靈活運用Python中的for循環。 一、for循環遍歷列表的基礎用法 在Python中使用f…

    編程 2025-04-27
  • Python中for i in range()函數的用法

    本文將詳細闡述Python中for i in range函數的用法。對於初學者來說,這是學習Python編程的基礎之一。 一、range()函數與for循環 Python中的for…

    編程 2025-04-27
  • index.html怎麼打開 – 詳細解析

    一、index.html怎麼打開看 1、如果你已經擁有了index.html文件,那麼你可以直接使用任何一個現代瀏覽器打開index.html文件,比如Google Chrome、…

    編程 2025-04-25

發表回復

登錄後才能評論