摘要:在運行時環(huán)境中,通過調(diào)用函數(shù)創(chuàng)建值,該函數(shù)動態(tài)生成匿名的唯一值。創(chuàng)建和使用值的唯一創(chuàng)建方法,是通過調(diào)用函數(shù)來返回,不支持操作。共享體系提供了一個全局注冊表,用于在大文件或多文件代碼中追蹤值。
Symbol由來
Symbol是ES6引入的新類型,所以在ES5的基礎(chǔ)上,JS就有了字符串(string)、數(shù)字型(number)、布爾(bool)、null、undefined和Symbol共六種基本類型(bigint ES2016 添加)。
In JavaScript, Symbol is a primitive value.創(chuàng)建和使用Symbol
Symbol是一種原始數(shù)據(jù)類型
什么是原始數(shù)據(jù)類型
A value having the data type "symbol" can be referred to as a "symbol value." In the JavaScript run-time environment, a symbol value is created by invoking the function Symbol, which dynamically produces an anonymous, unique value. A symbol may be used as an object property.
具有Symbol數(shù)據(jù)類型的值被稱為"Symbol"值。在JavaScript運行時環(huán)境中,通過調(diào)用函數(shù)Symbol創(chuàng)建Symbol值,該函數(shù)動態(tài)生成匿名的唯一值。
Symbol can have an optional description, but for debugging purposes only.
MDN Symbol
該數(shù)據(jù)類型通常被用作一個對象屬性的鍵值——當(dāng)你想讓它是私有的時候。例如,symbol 類型的鍵存在于各種內(nèi)置的 JavaScript 對象中。同樣,自定義類也可以這樣創(chuàng)建私有成員。symbol 數(shù)據(jù)類型具有非常明確的目的,并且因為其功能性單一的優(yōu)點而突出;一個 symbol 實例可以被賦值到一個左值變量,還可以通過標(biāo)識符檢查類型,這就是它的全部特性。不能對該類型實例使用其他操作符(將“Symbol”類型的實例與 “Number” 類型的實例對比,例如整數(shù) 42,該實例就具有將值與其他類型的值進行比較或組合的運算符)。
Symbol值的唯一創(chuàng)建方法,是通過調(diào)用Symbol()函數(shù)來返回,不支持new操作。
Symbol接受一個可選參數(shù),可以添加一段文本描述,但這段描述不可用于屬性訪問。
let firstName = Symbol("first name"); let persion = {}; person[firstName] = "Tom"; console.log("first name" in person); // false console.log(persion[firstName]); // "Tom" console.log(firstName); // "Symbol(first name)"
Symbol的描述被存儲在內(nèi)部的[[Description]]屬性中,只有當(dāng)調(diào)用Symbol的toString方法才可以讀取這個屬性,但不能直接在代碼里訪問[[Description]]。
所有使用計算屬性名的地方,都可以使用Symbol。
let firstName = Symbol("first name"); let person = { [firstName] : "Tom" } Object.defineProperty(person, firstName, { writable: false}); let lastName = Symbol("last name"); Object.defineProperties(person, { [lastName]: { value: "Lee", writable: false } }); console.log(person[firstName]); // Tome console.log(person[lastName]); // Lee const propertyNames = Object.getOwnPropertyNames(person); console.log(propertyNames); // [] const propertySymbols = Object.getOwnPropertySymbols(person); console.log(propertySymbols); // [Symbol(first name), Symbol(last name)]共享體系
Symbol提供了一個全局注冊表,用于在大文件或多文件代碼中追蹤Symbol值。
如果想創(chuàng)建一個可共享的Symbol,需要使用Symbol.for方法。它只接受一個參數(shù),也就是即將創(chuàng)建的Symbol的字符串標(biāo)識,這個參數(shù)也被用作Symbol的描述。
let uid = Symbol.for("uid"); let obj = {}; obj[uid] = "12345"; console.log(obj[uid]); // "12345" console.log(uid); // "Symbol(uid)" console.log(Symbol.forKey(uid)); // "uid"
Symbol.for方法首先在全局注冊表中搜索鍵值為"uid"的Symbo值,如果存在,直接返回已有的Symbol,否則,創(chuàng)建一個新的Symbol,并使用這個鍵在Symbol全局注冊表中注冊,隨即返回新創(chuàng)建的Symbol。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/105629.html
類型 基本類型 - string - number - boolean - null - undefined - symbol(表示獨一無二的值,使用時需要注意瀏覽器是否支持) //example const symbol1 = Symbol(); const symbol2 = Symbol(42); const symbol3 = Symbol(...
摘要:在函數(shù)方面的擴展比較豐富也很實用,本篇概括了這中的精華知識。所以無法成為構(gòu)造函數(shù),不能使用操作符。參數(shù)將擴展運算符作用于參數(shù),即為參數(shù)。聲明式,直接為函數(shù)名。通過構(gòu)造函數(shù)生成的,為。函數(shù)的屬性,在其描述對象的屬性上,為函數(shù)名。 ES6在函數(shù)方面的擴展比較豐富也很實用,本篇概括了這中的精華知識。 1 箭頭函數(shù) 箭頭函數(shù)是ES6中定義函數(shù)的新形式。 新形式不僅簡化了定義方式,更為函數(shù)本身...
摘要:返回布爾值標(biāo)簽?zāi)0蹇梢跃o跟一個函數(shù)名后邊,該函數(shù)將被調(diào)用來處理這個模板字符串。其它情況下返回值為在內(nèi)部,整數(shù)和浮點數(shù)使用同樣的存儲方法,所以和被視為同一個值。 簡介 ES6目標(biāo),讓JavaScript變成一個企業(yè)級的開發(fā)語言,不僅僅限制與前端頁面的腳本語言。 標(biāo)準(zhǔn)(Standard): 用于定義與其他事物區(qū)別的一套規(guī)則 實現(xiàn)(Implementation): 某個標(biāo)準(zhǔn)的具體實施/真實實...
摘要:屬性的簡潔表示法在中允許直接寫入變量和函數(shù),作為對象的屬性和方法,使得代碼的書寫更為簡潔。循環(huán)遍歷對象自身的和繼承的可枚舉屬性不含屬性。返回一個數(shù)組,包含對象自身的所有屬性的鍵名。 showImg(https://segmentfault.com/img/remote/1460000019259004?w=1282&h=1920); 1. 屬性的簡潔表示法 在ES6中 允許直接寫入變量...
閱讀 2423·2021-10-09 09:59
閱讀 2177·2021-09-23 11:30
閱讀 2591·2019-08-30 15:56
閱讀 1145·2019-08-30 14:00
閱讀 2939·2019-08-29 12:37
閱讀 1253·2019-08-28 18:16
閱讀 1656·2019-08-27 10:56
閱讀 1022·2019-08-26 17:23