摘要:概述的對(duì)象屬性名都是字符串,這容易造成屬性名的沖突。這就是引入的原因。它是語(yǔ)言的第七種數(shù)據(jù)類型,前六種是布爾值字符串?dāng)?shù)值對(duì)象。它將創(chuàng)建唯一的標(biāo)識(shí)符,并將其存儲(chǔ)在中。同理,在對(duì)象的內(nèi)部,使用值定義屬性時(shí),值必須放在方括號(hào)之中。
概述
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)。
let s = Symbol(); typeof s // "symbol"
Symbol 是一種獨(dú)特的且不可變的數(shù)據(jù)類型,經(jīng)常用來(lái)標(biāo)識(shí)對(duì)象屬性。
要?jiǎng)?chuàng)建 Symbol,輸入 Symbol(),并添加一個(gè)可選的字符串作為其描述。
const sym1 = Symbol("apple"); console.log(sym1); //Symbol(apple)
它將創(chuàng)建唯一的標(biāo)識(shí)符,并將其存儲(chǔ)在 sym1 中。描述 "apple" 只是用來(lái)描述標(biāo)識(shí)符的一種方式,但是不能用來(lái)訪問(wèn)標(biāo)識(shí)符本身。
如果對(duì)具有相同描述的兩個(gè)標(biāo)識(shí)符進(jìn)行比較……
const sym2 = Symbol("banana"); const sym3 = Symbol("banana"); console.log(sym2 === sym3);
結(jié)果是 false,因?yàn)槊枋鲋皇怯脕?lái)描述符號(hào),它并不是標(biāo)識(shí)符本身的一部分。無(wú)論描述是什么,每次都創(chuàng)建新的標(biāo)識(shí)符。
Symbol 值不能與其他類型的值進(jìn)行運(yùn)算,會(huì)報(bào)錯(cuò)。但是,Symbol 值可以顯式轉(zhuǎn)為字符串。也可以轉(zhuǎn)為布爾值,但是不能轉(zhuǎn)為數(shù)值。
let sym = Symbol("My symbol"); "your symbol is " + sym // TypeError: can"t convert symbol to string String(sym) // "Symbol(My symbol)" sym.toString() // "Symbol(My symbol)" Boolean(sym) // true !sym // false Number(sym) // TypeError sym + 2 // TypeError作為屬性名的 Symbol
由于每一個(gè) Symbol 值都是不相等的,這意味著 Symbol 值可以作為標(biāo)識(shí)符,用于對(duì)象的屬性名,就能保證不會(huì)出現(xiàn)同名的屬性
let mySymbol = Symbol(); // 第一種寫法 let a = {}; a[mySymbol] = "Hello!"; // 第二種寫法 let a = { [mySymbol]: "Hello!" }; a[mySymbol] // "Hello!"
注意,Symbol 值作為對(duì)象屬性名時(shí),不能用點(diǎn)運(yùn)算符。同理,在對(duì)象的內(nèi)部,使用 Symbol 值定義屬性時(shí),Symbol 值必須放在方括號(hào)之中。
屬性名的遍歷Symbol 作為屬性名,該屬性不會(huì)出現(xiàn)在for...in、for...of循環(huán)中,也不會(huì)被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,它也不是私有屬性,有一個(gè)Object.getOwnPropertySymbols方法,可以獲取指定對(duì)象的所有 Symbol 屬性名。
const obj = {}; let a = Symbol("a"); let b = Symbol("b"); obj[a] = "Hello"; obj[b] = "World"; const objectSymbols = Object.getOwnPropertySymbols(obj); objectSymbols // [Symbol(a), Symbol(b)]
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/90772.html
摘要:有兩個(gè)協(xié)議可迭代協(xié)議和迭代器協(xié)議。為了變成可迭代對(duì)象,一個(gè)對(duì)象必須實(shí)現(xiàn)或者它原型鏈的某個(gè)對(duì)象必須有一個(gè)名字是的屬性迭代器協(xié)議該迭代器協(xié)議定義了一種標(biāo)準(zhǔn)的方式來(lái)產(chǎn)生一個(gè)有限或無(wú)限序列的值。 ECMAScript 2015的幾個(gè)補(bǔ)充,并不是新的內(nèi)置或語(yǔ)法,而是協(xié)議。這些協(xié)議可以被任何遵循某些約定的對(duì)象來(lái)實(shí)現(xiàn)。有兩個(gè)協(xié)議:可迭代協(xié)議和迭代器協(xié)議。 可迭代協(xié)議 可迭代協(xié)議允許 JavaScri...
摘要:基本原理解構(gòu)是提供的語(yǔ)法糖,其實(shí)內(nèi)在是針對(duì)可迭代對(duì)象的接口,通過(guò)遍歷器按順序獲取對(duì)應(yīng)的值進(jìn)行賦值。屬性值返回一個(gè)對(duì)象的無(wú)參函數(shù),被返回對(duì)象符合迭代器協(xié)議。迭代器協(xié)議定義了標(biāo)準(zhǔn)的方式來(lái)產(chǎn)生一個(gè)有限或無(wú)限序列值。 更多系列文章請(qǐng)看 1、基本語(yǔ)法 1.1、數(shù)組 // 基礎(chǔ)類型解構(gòu) let [a, b, c] = [1, 2, 3] console.log(a, b, c) // 1, 2, ...
摘要:今天這篇文章我們來(lái)看看一道必會(huì)面試題,即如何實(shí)現(xiàn)一個(gè)深拷貝。木易楊注意這里使用上面測(cè)試用例測(cè)試一下一個(gè)簡(jiǎn)單的深拷貝就完成了,但是這個(gè)實(shí)現(xiàn)還存在很多問(wèn)題。 引言 上篇文章詳細(xì)介紹了淺拷貝 Object.assign,并對(duì)其進(jìn)行了模擬實(shí)現(xiàn),在實(shí)現(xiàn)的過(guò)程中,介紹了很多基礎(chǔ)知識(shí)。今天這篇文章我們來(lái)看看一道必會(huì)面試題,即如何實(shí)現(xiàn)一個(gè)深拷貝。本文會(huì)詳細(xì)介紹對(duì)象、數(shù)組、循環(huán)引用、引用丟失、Symbo...
摘要:可迭代對(duì)象就具有屬性,它是一種與迭代器密切相關(guān)的對(duì)象。它通過(guò)指定的函數(shù)可以返回一個(gè)作用于附屬對(duì)象的迭代器。迭代器特點(diǎn)每次調(diào)用方法時(shí),返回一個(gè)數(shù)組,數(shù)組中兩個(gè)元素,分別表示鍵和值。示例之輸出輸出輸出之迭代器特點(diǎn)返回集合中存在的每一個(gè)鍵。 Iterator由來(lái) 不推薦Iterator方法。 Iterator 函數(shù)是一個(gè) SpiderMonkey 專有特性,并且會(huì)在某一時(shí)刻被刪除。有一點(diǎn),需...
摘要:另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。因?yàn)橹稻哂形ㄒ恍裕@就意味著作為對(duì)象的屬性名時(shí),可以保證不會(huì)出現(xiàn)同名的屬性。不過(guò),這個(gè)提議在中被拒絕了,也許之后的版本會(huì)再考慮。事實(shí)上,與都有語(yǔ)法解決構(gòu)造器中屬性名重復(fù)的問(wèn)題。 譯者按: 這篇博客將介紹ES6新增的Object.assign()方法。 原文: ECMAScript 6: merging objects via Object...
閱讀 3119·2021-10-12 10:12
閱讀 5622·2021-09-26 10:20
閱讀 1579·2021-07-26 23:38
閱讀 2870·2019-08-30 15:54
閱讀 1708·2019-08-30 13:45
閱讀 2013·2019-08-30 11:23
閱讀 3164·2019-08-29 13:49
閱讀 932·2019-08-26 18:23