Symbol是ES6引入的新類型,因此在ES5的基礎上,JS就有了字符串(string)、數字型(number)、布爾(bool)、null、undefined和Symbol共六種基本類型(bigint ES2016 添加)。函數
In JavaScript, Symbol is a primitive value.
Symbol是一種原始數據類型
什麼是原始數據類型
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數據類型的值被稱爲"Symbol"值。在JavaScript運行時環境中,經過調用函數Symbol建立Symbol值,該函數動態生成 匿名的 惟一值。
Symbol can have an optional description, but for debugging purposes only.
MDN Symbol
該數據類型一般被用做一個對象屬性的鍵值——當你想讓它是私有的時候。例如,symbol 類型的鍵存在於各類內置的 JavaScript 對象中。一樣,自定義類也能夠這樣建立私有成員。symbol 數據類型具備很是明確的目的,而且由於其功能性單一的優勢而突出;一個 symbol 實例能夠被賦值到一個左值變量,還能夠經過標識符檢查類型,這就是它的所有特性。不能對該類型實例使用其餘操做符(將「Symbol」類型的實例與 「Number」 類型的實例對比,例如整數 42,該實例就具備將值與其餘類型的值進行比較或組合的運算符)。
Symbol值的惟一建立方法,是經過調用Symbol()函數來返回,不支持new操做。
Symbol接受一個可選參數,能夠添加一段文本描述,但這段描述不可用於屬性訪問。ui
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的描述被存儲在內部的[[Description]]屬性中,只有當調用Symbol的toString方法才能夠讀取這個屬性,但不能直接在代碼裏訪問[[Description]]。
全部使用計算屬性名的地方,均可以使用Symbol。debug
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值。
若是想建立一個可共享的Symbol,須要使用Symbol.for方法。它只接受一個參數,也就是即將建立的Symbol的字符串標識,這個參數也被用做Symbol的描述。code
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,不然,建立一個新的Symbol,並使用這個鍵在Symbol全局註冊表中註冊,隨即返回新建立的Symbol。對象