ES6之symbol

ES6引入了一種新的原始數據類型Symbol,是第七種數據類型,表示獨一無二的值。語法:函數

var sym = Symbol();spa

console.log(typeof sym);//symbolcode

Symbol函數接收一個字符串參數,表示描述,主要爲了在控制檯顯示或者轉成字符串區分:cdn

var sym1 = Symbol('sym1');對象

var sym2 = Symbol('sym2');字符串

console.log(sym1);//Symbol(sym1)get

console.log(sym2);//Symbol(sym2)iframe

若是是對象,會調用toString方法:string

var obj = {it

toString(){

return 'sym'  
複製代碼

}

}

var sym = Symbol(obj)

console.log(sym);//Symbol(sym)

Symbol參數只表示當前值的描述,由於Symbol表示獨一無二,因此全部的Symbol都不相等,無論有沒有參數:

var sym1 = Symbol();

var sym2 = Symbol();

console.log(sym1 == sym2);//false

Symbol不能進行運算,會報錯,能夠顯示轉成字符串,也能夠當作布爾值,都是true,可是不能轉成數值:

var sym1 = Symbol();

console.log(sym1 + 'is');//TypeError

console.log(Boolean(sym1));//true

console.log(Number(sym1));//TypeError

做爲屬性名只能經過[]:

var sym1 = Symbol();

var obj = {};

obj[sym1] = 'sym1';

console.log(obj[sym1]);//sym1

做爲屬性名,最主要的就是這個key是獨一無二的,不會被覆蓋或者改寫

消除魔術字符串:

魔術字符串就是一個字符串在多個地方出現,當咱們要修改這個字符串的時候須要全部都修改,想消除就是把這個字符串變成變量,想修改只須要改一個變量。經過symbol的獨一無二很適合把這個變量經過對象屬性變成Symbol。

遍歷:

Symbol的屬性不能經過for in或者for of獲取,Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()也沒法獲取,getOwnPropertySymbols能獲取Symbol的,ownKeys能獲取全部的:

var obj = {

con: 'con'

}

for(var i in obj){

console.log(i);//con

}

console.log(Object.keys(obj));//[con]

console.log(Object.getOwnPropertySymbols(obj));//[Symbol(syml)]

console.log(Reflect.ownKeys(obj));//["con", Symbol(syml)]

利用這個特性,能夠爲對象定義一些非私有的、但又但願只用於內部的方法。

Symbol.for():

Symbol.for()接受一個字符串做爲參數,而後搜索有沒有以該參數做爲名稱的 Symbol 值。若是有,就返回這個 Symbol 值,不然就新建並返回一個以該字符串爲名稱的 Symbol 值:

var sym1 = Symbol.for('syml');

var sym2 = Symbol.for('syml');

console.log(sym1 == sym2);//true

Symbol.for()會被登記在全局環境中供搜索,不會每次調用就返回一個新的 Symbol 類型的值,而是會先檢查給定的key是否已經存在,若是不存在纔會新建一個值。

Symbol.keyFor()返回一個已登記的 Symbol 類型值的key:

var sym1 = Symbol.for("sym1");

console.log(Symbol.keyFor(sym1)); // "sym1"

var sym2 = Symbol("sym2");

console.log(Symbol.keyFor(sym2)); // undefined

有一點頗有趣Symbol.for爲 Symbol 值登記的名字,是全局環境的,能夠在不一樣的 iframe 或 service worker 中取到同一個值。能夠用來通訊。

內置的屬性方法:

Symbol提供了11個內置的屬性,看了一遍,以爲仍是不須要研究的好。

最後總結一下,Symbol是新增的數據類型,表示獨一無二:

var sym1 = Symbol();

var sym2 = Symbol();

console.log(sym1 == sym2);//false

用來作屬性的key,不會被修改覆蓋。

Coding 我的筆記

相關文章
相關標籤/搜索