JavaScript中的符號(hào)(Symbols)
符號(hào)是在ES6中引入的一種原始類(lèi)型,用作非字符串屬性名。要理解符號(hào),重要的是要知道在JavaScript中,基本類(lèi)型Object
是一個(gè)無(wú)序的屬性集合,每個(gè)屬性都有一個(gè)名稱和一個(gè)值。屬性名稱通常(直到ES6之前)是字符串。然而,在ES6和之后的版本中,符號(hào)也可以用作屬性名:
符號(hào)沒(méi)有字面量語(yǔ)法。要獲取符號(hào)值,您需要調(diào)用Symbol()
函數(shù)。該函數(shù)永遠(yuǎn)不會(huì)返回相同的值,即使每次都提供相同的參數(shù)。這意味著您可以安全地使用調(diào)用Symbol()
的結(jié)果將新屬性添加到對(duì)象中,而不必?fù)?dān)心覆蓋具有相同名稱的現(xiàn)有屬性。類(lèi)似地,如果定義了一個(gè)符號(hào)屬性并且不共享相應(yīng)的符號(hào),您可以確信代碼的其他部分不會(huì)意外覆蓋該屬性。
(程序員的軟技能:ke.qq.com/course/6034346)
在實(shí)踐中,符號(hào)通常用作語(yǔ)言擴(kuò)展的機(jī)制。ES6引入了for/of
循環(huán)和可迭代對(duì)象的概念,這需要為類(lèi)定義一種標(biāo)準(zhǔn)化的方式,使它們能夠自身成為可迭代的。然而,將任何特定的字符串用作此迭代器方法的名稱可能會(huì)與現(xiàn)有代碼沖突。這就是符號(hào)的作用。Symbol.iterator
是一個(gè)符號(hào)值,可以用作方法名以使對(duì)象成為可迭代的。
Symbol()
函數(shù)可以選擇接受一個(gè)字符串參數(shù),并返回一個(gè)唯一的符號(hào)值。如果提供了字符串參數(shù),調(diào)用返回的符號(hào)值上的toString()
方法的結(jié)果將包含該字符串。然而,重要的是要注意,使用相同的字符串調(diào)用Symbol()
兩次會(huì)導(dǎo)致兩個(gè)完全不同的符號(hào)值。
符號(hào)值的唯一有趣方法是toString()
。然而,還有兩個(gè)與符號(hào)相關(guān)的函數(shù)值得了解。有時(shí)在使用符號(hào)時(shí),您希望它們對(duì)您的代碼保持私有,以確保您的屬性不會(huì)與其他代碼的屬性沖突。但是在其他時(shí)候,您可能希望定義可以與其他代碼共享的符號(hào)。例如,如果您定義了一個(gè)擴(kuò)展并希望其他代碼使用它,類(lèi)似于前面提到的Symbol.iterator
機(jī)制。
為了定義可以與其他代碼共享的符號(hào),JavaScript具有全局符號(hào)注冊(cè)表。Symbol.for()
函數(shù)接受一個(gè)字符串參數(shù),并返回與該字符串關(guān)聯(lián)的符號(hào)值。如果沒(méi)有與字符串關(guān)聯(lián)的符號(hào),它將創(chuàng)建并返回一個(gè)新的符號(hào);否則,它將返回現(xiàn)有的符號(hào)。換句話說(shuō),Symbol.for()
和Symbol()
是完全不同的:Symbol()
永遠(yuǎn)不會(huì)返回相同的值,而Symbol.for()
在使用相同的字符串調(diào)用時(shí)總是返回相同的值。提供給Symbol.for()
的字符串將出現(xiàn)在toString()
的輸出中(當(dāng)返回符號(hào)值時(shí))。此外,通過(guò)使用Symbol.keyFor()
傳遞返回的符號(hào),可以檢索此字符串:
(程序員的軟技能:ke.qq.com/course/6034346)