摘要:先搜索全局符號注冊表,如果已有,則返回這個已存在的符號值否則,會創(chuàng)建一個新的符號值,并使用該鍵值將其記錄到全局符號注冊表中,然后返回這個新的符號值。
主要知識點(diǎn):創(chuàng)建符號值、使用符號值、共享符號值、符號值轉(zhuǎn)換。檢索符號值屬性以及知名符號
《深入理解ES6》筆記 目錄
ES5 的對象屬性名都是字符串,這容易造成屬性名的沖突。比如,你使用了一個他人提供的對象,但又想為這個對象添加新的方法(mixin 模式),新方法的名字就有可能與現(xiàn)有方法產(chǎn)生沖突。如果有一種機(jī)制,保證每個屬性的名字都是獨(dú)一無二的就好了,這樣就從根本上防止屬性名的沖突。這就是 ES6 引入Symbol的原因。
ES6 引入了一種新的原始數(shù)據(jù)類型Symbol,表示獨(dú)一無二的值。它是 JavaScript 語言的第七種數(shù)據(jù)類型,前六種是:undefined、null、布爾值(Boolean)、字符串(String)、數(shù)值(Number)、對象(Object)。
創(chuàng)建符號值let firstName = Symbol(); let person = {}; person[firstName] = "Nicholas"; console.log(person[firstName]); // "Nicholas" console.log(firstName ); // Symbol() typeof firstName //"symbol"
由于符號值是基本類型的值,因此調(diào)用 new Symbol() 將會拋出錯誤。你可以通過 new
Object(yourSymbol) 來創(chuàng)建一個符號實例,但尚不清楚這能有什么作用。
Symbol 函數(shù)還可以接受一個額外的參數(shù)用于描述符號值,該描述并不能用來訪問對應(yīng)屬性,可以用于調(diào)試;
let firstName = Symbol("first name"); let person = {}; person[firstName] = "Nicholas"; console.log("first name" in person); // false console.log(person[firstName]); // "Nicholas" console.log(firstName); // "Symbol(first name)"使用符號值
可以在任意能使用“需計算屬性名”的場合使用符號,還可以在Object.defineProperty() 或 Object.defineProperties() 調(diào)用中使用它:
let firstName = Symbol("first name"); // 使用一個需計算字面量屬性 let person = { [firstName]: "Nicholas" }; // 讓該屬性變?yōu)橹蛔x Object.defineProperty(person, firstName, { writable: false }); let lastName = Symbol("last name"); Object.defineProperties(person, { [lastName]: { value: "Zakas", writable: false } }); console.log(person[firstName]); // "Nicholas" console.log(person[lastName]); // "Zakas"共享符號值
如果需要在應(yīng)用中需要在兩個不同的對象類型中使用同一個符號屬性,用來表示一個唯一標(biāo)識符,可以使用Symbol.for()創(chuàng)建共享符號值;
Symbol.for()方法僅接受單個字符串類型的參數(shù),作為目標(biāo)符號值的標(biāo)識符,同時此參數(shù)也會成為該符號的描述信息。
let uid = Symbol.for("uid"); let object = {}; object[uid] = "12345"; console.log(object[uid]); // "12345" console.log(uid); // "Symbol(uid)"
先搜索全局符號注冊表,如果已有,則返回這個已存在的符號值;否則,會創(chuàng)建一個新的符號值,并使用該鍵值將其記錄到全局符號注冊表中,然后返回這個新的符號值。
let uid = Symbol.for("uid"); let object = { [uid]: "12345" }; console.log(object[uid]); // "12345" console.log(uid); // "Symbol(uid)" let uid2 = Symbol.for("uid"); console.log(uid === uid2); // true console.log(object[uid2]); // "12345" console.log(uid2); // "Symbol(uid)"
Symbol.keyFor() 方法在全局符號注冊表中根據(jù)符號值檢索出對應(yīng)的鍵值:
let uid = Symbol.for("uid"); console.log(Symbol.keyFor(uid)); // "uid" let uid2 = Symbol.for("uid"); console.log(Symbol.keyFor(uid2)); // "uid" //uid3在全局注冊表中并不存在,會返回undefined let uid3 = Symbol("uid"); console.log(Symbol.keyFor(uid3)); // undefined符號值的轉(zhuǎn)換
類型轉(zhuǎn)換是 JS 語言重要的一部分,能夠非常靈活地將一種數(shù)據(jù)類型轉(zhuǎn)換為另一種。然而符號類型在進(jìn)行轉(zhuǎn)換時非常不靈活,因為其他類型缺乏與符號值的合理等價,尤其是符號值無法被轉(zhuǎn)換為字符串值或數(shù)值,在邏輯運(yùn)算符中會被認(rèn)為等價于 true。
let uid = Symbol.for("uid"), desc = uid + ""; // 引發(fā)錯誤!
// 使用console.log() 來展示符號值的輸出,能這么做是由于自動調(diào)用了符號的 String() 方法來產(chǎn)生輸出。你也可以直接調(diào)用 String() 方法來獲取相同結(jié)果 let uid = Symbol.for("uid"), desc = String(uid); console.log(desc); // "Symbol(uid)"檢索符號屬性
Object.keys() 與 Object.getOwnPropertyNames() 方法可以檢索對象的所有屬性名稱,但不能返回符號類型的屬性,ES6 新增Object.getOwnPropertySymbols() 方法,以便讓你可以檢索對象的符號類型屬性。
Object.getOwnPropertySymbols() 方法會返回一個數(shù)組,包含了對象自有屬性名中的符號值:
let uid = Symbol.for("uid"); let object = { [uid]: "12345" }; let symbols = Object.getOwnPropertySymbols(object); console.log(symbols.length); // 1 console.log(symbols[0]); // "Symbol(uid)" console.log(object[symbols[0]]); // "12345"
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108471.html
摘要:設(shè)置對象屬性只讀。提供了一個注冊機(jī)制,當(dāng)你注冊之后,就能在全局共享注冊表里面的。的注冊表和對象表很像,都是結(jié)構(gòu),只不過這個是值。語法只有一個參數(shù),返回的是從注冊表獲取全局共享的注意如果要防止命名重復(fù)問題,可以加上前綴。 還記得對象Object嗎? let obj = { a: 1 } 對象的格式: Object { key: value } 在ES5的時代,對象的key只能...
摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會報錯。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完...
摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會報錯。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完...
閱讀 3244·2021-11-24 09:39
閱讀 3187·2021-10-21 09:38
閱讀 2407·2019-08-29 15:28
閱讀 3750·2019-08-26 12:23
閱讀 2626·2019-08-26 12:19
閱讀 1369·2019-08-23 12:44
閱讀 2136·2019-08-23 12:02
閱讀 1008·2019-08-22 17:05