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 我的筆記