国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入理解ES6筆記(六)Symbol與Symbol屬性

crossea / 2614人閱讀

摘要:先搜索全局符號(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

相關(guān)文章

  • 深入理解ES6筆記——SymbolSymbol屬性(6)

    摘要:設(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只能...

    heartFollower 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記)--JavaScript類型有哪些你不知道的細(xì)節(jié)?

    摘要:的碼點(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)筆記以及感悟,完...

    Lsnsh 評(píng)論0 收藏0
  • 重學(xué)前端學(xué)習(xí)筆記)--JavaScript類型有哪些你不知道的細(xì)節(jié)?

    摘要:的碼點(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)筆記以及感悟,完...

    joyvw 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<