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

資訊專欄INFORMATION COLUMN

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

crossea / 2625人閱讀

摘要:先搜索全局符號注冊表,如果已有,則返回這個已存在的符號值否則,會創(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

相關(guān)文章

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

    摘要:設(shè)置對象屬性只讀。提供了一個注冊機(jī)制,當(dāng)你注冊之后,就能在全局共享注冊表里面的。的注冊表和對象表很像,都是結(jié)構(gòu),只不過這個是值。語法只有一個參數(shù),返回的是從注冊表獲取全局共享的注意如果要防止命名重復(fù)問題,可以加上前綴。 還記得對象Object嗎? let obj = { a: 1 } 對象的格式: Object { key: value } 在ES5的時代,對象的key只能...

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

    摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會報錯。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完...

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

    摘要:的碼點(diǎn)被稱為基本字符區(qū)域。關(guān)于的介紹,我準(zhǔn)備用文檔阮一峰來做一些介紹,具體的可以參考文檔引入的原因的對象屬性名都是字符串,這容易造成屬性名的沖突。其他的一些屬性可以去看文檔阮一峰注意函數(shù)前不能使用命令,否則會報錯。 筆記說明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學(xué)習(xí)過程的一些要點(diǎn)筆記以及感悟,完...

    joyvw 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<