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