概述
- Symbol 是一種新的數(shù)據(jù)類型
- 與
null或undefined等六種類型并列。typeof的結果是symbol - 使用
Symbol()創(chuàng)建的值,獨一無二,與標識相同的symbol值也不同,沒有登記機制 - 不能與其他類型進行運算,拼接也不行
- 可顯式轉化成字符串
- 可以轉化成布爾類型
- 不可以轉化成數(shù)值類型
作為屬性名的Symbol
var mySymbol = Symbol();
var a = {
[mySymbol] : 'hello!'
}
// 只能用這種方式
a[mySymbol]
消除魔術字符串
魔術字符串,指的是在代碼中多次出現(xiàn),并且與代碼形成強耦合的具體字符串或者數(shù)值
- 其實這個案例是作為屬性值的Symbol
const shapgeType = {
triangle: Symbol()
};
function () {
// 只要 shapgeType 有屬性即可,不需要屬性值
}
屬性名的遍歷
- Symbol作為屬性名,不會出現(xiàn)在
for infor ofobject.keys()object.getOwnPropertyNames()JSON.stringify()
- 可以通過以下方法獲取
-
object.getOwnPropertySymbols(),返回一個數(shù)組 -
Reflect.ownKeys可以返回所有里類型的鍵名,包含常規(guī)鍵名和Symbol鍵名
Symbol.for() 和 Symbol.keyFor()
-
Symbol.for()相當于進行了登記 -
Symbol.keyFor()可以找到登記的Symbol - 登記的
Symbol是全局環(huán)境的,跨越iframe
// 不登記的情況
var s1 = Symbol('hi');
var s2 = Symbol('hi');
s1 === s2; // false
// 登記的情況
var s1 = Symbol.for('hi');
var s2 = Symbol.for('hi');
s1 === s2; // true
內置的 Symbol 值
ES6 內置了11個Symbol值,可以與一些方法結合使用。
-
Symbol.hasInstance和instanceof -
Symbol.isConcatSpreadable和 數(shù)組的concat方法 -
Symbol.match和str.match() -
Symbol.iterator指向對象的默認遍歷器方法 - 還有很多
// 對象進行 for of 循環(huán)時,會調用 Symbol.iterator 方法