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