概述
ES5中的對(duì)象屬性名都是字符串迎吵,如果我們使用了一個(gè)他人提供的對(duì)象,又需要為該對(duì)象添加新的方法(mixin模式),新的方法可能會(huì)與現(xiàn)有的方法產(chǎn)生沖突鹤树,ES6引入了新的數(shù)據(jù)類型Symbol
來(lái)保證每個(gè)屬性的名字是獨(dú)一無(wú)二的。
至此逊朽,JavaScript共有七種數(shù)據(jù)類型:undefined
罕伯、null
、布爾值(Boolean)叽讳、字符串(String)追他、數(shù)值(Number)、對(duì)象(Object)岛蚤、Symbol
邑狸。Symbol的值是通過(guò)Symbol
函數(shù)生成的,不能使用new
灭美。
let s = Symbol('foo');
typeof s // "symbol"
s1.toString() // "Symbol(foo)"
let s1 = Symbol('foo');
s === s1 // false
作為屬性名的Symbol
let a1 = Symbol.for('abc');
let obj = {
[a1]: '123',
'abc': 345,
'c': 456
};
console.log('obj', obj);
Symbol的值作為對(duì)象屬性名時(shí)推溃,不能使用點(diǎn)運(yùn)算符。此時(shí)届腐,該屬性是公開(kāi)屬性铁坎,不是私有屬性。
Symbol類型還可以定義一組常量犁苏,保證這組常量的值都是不相等的硬萍。
const COLOR_RED = Symbol();
const COLOR_GREEN = Symbol();
function getComplement(color) {
switch (color) {
case COLOR_RED:
return COLOR_GREEN;
case COLOR_GREEN:
return COLOR_RED;
default:
throw new Error('Undefined color');
}
}
屬性名的遍歷
Symbol作為屬性名,不會(huì)被for...in
围详、for...of
遍歷朴乖,也不會(huì)被Object.keys()
祖屏、Ojbect.getOwnPropertyNames()
、JSON.stringify()
返回买羞。
它可以通過(guò)Object.getOwnPropertySymbols()
遍歷袁勺,該方法趕回一個(gè)數(shù)組,也可以通過(guò)Reflect.ownKeys
方法遍歷:
let a1 = Symbol.for('abc');
let obj = {
[a1]: '123',
'abc': 345,
'c': 456
};
console.log('obj', obj);
for (let [key, value] of Object.entries(obj)) {
console.log('let of', key, value);
}
Object.getOwnPropertySymbols(obj).forEach((item) => console.log(obj[item]));
Reflect.ownKeys(obj).forEach((item) => console.log('ownkeys', item, obj[item]));
Symbol.for(), Symbol.keyFor()
通過(guò)Symbol.for
方法可以重新使用同一個(gè)Symbol值畜普,它的參數(shù)是一個(gè)字符串期丰,然后搜索是否有以該參數(shù)作為名稱的Symbol值。如果有吃挑,就返回這個(gè)Symbol值钝荡,否則會(huì)新建并返回一個(gè)以該字符串為名稱的Symbol值。
let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');
s1 === s2 // true
Symbol.keyFor
方法返回一個(gè)已登記的Symbol類型值的key
舶衬。
let s1 = Symbol.for('foo');
Symbol.keyFor(s1) // "foo"
let s2 = Symbol('foo');
Symbol.keyFor(s2) // undefined
內(nèi)置的Symbol值
ES6提供了11個(gè)內(nèi)置的Symbol值埠通,指向語(yǔ)言內(nèi)部的使用方法。
Symbol.hasInstance
Symbol.isConcatSpreadable
Symbol.species
Symbol.match
Symbol.replace
Symbol.search
Symbol.split
-
Symbol.iterator
對(duì)象進(jìn)行
for...of
循環(huán)時(shí)逛犹,會(huì)調(diào)用此方法端辱。 Symbol.toPrimitive
Symbol.toStringTag
Symbol.unscopables
具體使用方法和介紹可以參考阮一峰老師的教程 內(nèi)置的Symbol值。