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