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