ES6之symbol

wade3po發表於2019-04-30

ES6引入了一種新的原始資料型別Symbol,是第七種資料型別,表示獨一無二的值。語法:

var sym = Symbol();

console.log(typeof sym);//symbol

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

var sym1 = Symbol('sym1');

var sym2 = Symbol('sym2');

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

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

如果是物件,會呼叫toString方法:

var obj = {

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 個人筆記

ES6之symbol

相關文章