ES6 引入了一種新的原始數(shù)據(jù)類型Symbol叛买,表示獨一無二的值。
const s1 = Symbol();
const s2 = Symbol();
console.log(s1 === s2) // false
Symbol 函數(shù)可以接受一個字符串作為參數(shù)锭环,表示對 Symbol 實例的描述,可用于調(diào)試但不能訪問symbol本身聪全。
const s3 = Symbol('hello');
傳入數(shù)字會當(dāng)做字符串處理
const s4 = Symbol(123);
每個從Symbol()返回的symbol值都是唯一的。一個symbol值能作為對象屬性的標(biāo)識符辅辩,Symbol 值都是不相等的难礼,這意味著 Symbol 值可以作為標(biāo)識符,用于對象的屬性名玫锋,就能保證不會出現(xiàn)同名的屬性蛾茉。Symbol 值作為對象屬性名時,不能用點運算符,要使用[]撩鹿。
let prop = 'name';
let info = {
[prop]:'tina'
}
console.log(info[prop]) //tina
let s5 = Symbol('name');
let info2 = {
[s5]: 'tina',
age: 18
}
info2[s5] = 'bob'
console.log(info2[s5]) //'bob'
當(dāng)使用了Symbol作為對象的屬性的標(biāo)識符后宵凌,在對該對象進(jìn)行key的枚舉時劳淆。
for in:未找到Symbol屬性的標(biāo)識符。
for (const key in info2) {
console.log(key)// age
}
Object.keys(obj):未找到Symbol屬性的標(biāo)識符。
console.log(Object.keys(info2)) //[age]
Object.getOwnPropertyNames(obj):未找到Symbol屬性的標(biāo)識符望众。
console.log(Object.getOwnPropertyNames(info2))//[age]
JSON.stringify(obj):未找到Symbol屬性的標(biāo)識符。
console.log(JSON.stringify(info2)) //{"age":18}
有上述代碼可知Symbol類型的屬性描述符涛漂,它未被包含到自身屬性名集合中奄抽,我們可以把一些不需要對外操作和訪問的屬性使用Symbol來定義。
當(dāng)然也有專門獲取對象中Symbol屬性的標(biāo)識符的方法Object.getOwnPropertySymbols(obj)和Reflect.ownKeys(obj)
console.log(Object.getOwnPropertySymbols(info2)) //[Symbol(name)]
console.log(Reflect.ownKeys(info2)) //["age", Symbol(name)]
Symbol 靜態(tài)方法
Symbol.for(key)使用給定的key搜索現(xiàn)有的symbol叫搁,如果找到則返回該symbol赔桌。否則將使用給定的key在全局symbol注冊表中創(chuàng)建一個新的symbol。
let s6 = Symbol.for('s6');
let _s6 = Symbol.for('s6');
console.log(s6 === _s6) //true
Symbol.keyFor(sym)從使用Symbol.for(key)注冊的全局symbol中渴逻,為給定的symbol檢索一個共享的?symbol key疾党。
console.log(Symbol.keyFor(s6)); //'s6'
es6自帶的Symbol值
Symbol.iterator
一個返回一個對象默認(rèn)迭代器的方法。被 for...of 使用惨奕。
Symbol.asyncIterator
一個返回對象默認(rèn)的異步迭代器的方法雪位。被 for await of 使用。
Symbol.match
一個用于對字符串進(jìn)行匹配的方法梨撞,也用于確定一個對象是否可以作為正則表達(dá)式使用雹洗。被 String.prototype.match() 使用。
Symbol.replace
一個替換匹配字符串的子串的方法. 被 String.prototype.replace() 使用聋袋。
Symbol.search
一個返回一個字符串中與正則表達(dá)式相匹配的索引的方法队伟。被String.prototype.search() 使用。
Symbol.split
一個在匹配正則表達(dá)式的索引處拆分一個字符串的方法.幽勒。被 String.prototype.split() 使用嗜侮。
Symbol.hasInstance
一個確定一個構(gòu)造器對象識別的對象是否為它的實例的方法。被 instanceof 使用啥容。
Symbol.isConcatSpreadable
一個布爾值锈颗,表明一個對象是否應(yīng)該flattened為它的數(shù)組元素。被 Array.prototype.concat() 使用咪惠。
Symbol.unscopables
擁有和繼承屬性名的一個對象的值被排除在與環(huán)境綁定的相關(guān)對象外击吱。
Symbol.species
一個用于創(chuàng)建派生對象的構(gòu)造器函數(shù)。
Symbol.toPrimitive
一個將對象轉(zhuǎn)化為基本數(shù)據(jù)類型的方法遥昧。
Symbol.toStringTag
用于對象的默認(rèn)描述的字符串值覆醇。被 Object.prototype.toString() 使用朵纷。