Symbol(符號(hào))
一. 概念
是一種新的數(shù)據(jù)類型悟泵,值之間互不等
<html>
<span style='color:red'>注:Symbol為生產(chǎn)Symbol類型數(shù)據(jù)的函數(shù),而不是數(shù)據(jù)類型本身</span>
</html>
值類型而非引用類型
var a = new Symbol() // throw err
var b = Symbol()
typeof b // symbol
只可通過Object.getOwnPropertySymbols獲取
for in冬筒、for of、Object.keys()从祝、Object.getOwnPropertyNames()续语、無法遍歷出symbol屬性
var a = Symbol()
var b = {}
b[a] = "hehe"
Object.keys(b) // []垂谢,數(shù)組為空
Object.getOwnPropertySymbols() // [ Symbol() ]
<html>
<span style='color:red'>注:所有引用類型數(shù)據(jù)都是通過new操作符產(chǎn)生的,因此使用new操作符報(bào)錯(cuò)可證明其數(shù)據(jù)類型為值類型</span>
</html>
二. 語法
1. 使用Symbol函數(shù)生成Symbol類型值
// 局部Symbol
var a = Symbol()
var b = Symbol('symbol')
var c = Symbol('symbol')
a === b // false
b === c // false
c === a // false
2. 注冊(cè)全局可重用Symbol
// 全局Symbol
// 全局注冊(cè)key1與key2
var key1 = Symbol.for('key1')
var key2 = Symbol.for('key2')
key1 === key2 // false
// 從全局獲取key2鍵對(duì)應(yīng)的Symbol
var tempKey2 = Symbol.for('key2')
key2 === tempKey2 // true
// 通過Symbol獲取全局表中對(duì)應(yīng)的key
console.log(Symbol.keyFor(key2)) // key2
三. 用途
1. 防沖突
- 第三方庫的命名沖突
- 狀態(tài)管理中狀態(tài)沖突
- 與標(biāo)準(zhǔn)api沖突
2. 枚舉
四. 內(nèi)置Symbol
symbol內(nèi)置在了許多對(duì)象中作為屬性名稱,會(huì)在特定情況下觸發(fā)
描述 | 含義 |
---|---|
Symbol.iterator | 用于為對(duì)象定義一個(gè)方法并返回一個(gè)屬于所對(duì)應(yīng)對(duì)象的迭代器疮茄,該迭代器會(huì)被for-of循環(huán)語句所使用 |
Symbol.hasInstance | 用于為類定義一個(gè)方法滥朱,該方法會(huì)因?yàn)閕nstanceof語句的使用而被調(diào)用根暑,來檢查一個(gè)對(duì)西那個(gè)是否是某一個(gè)類的實(shí)例 |
Symbol.match | 用于為正則表達(dá)式定義一個(gè)可被String.prototype.match方法使用的方法,檢查對(duì)應(yīng)的字符串與當(dāng)前正則表達(dá)式是否匹配 |
Symbol.replace | 用于為正則表達(dá)式或?qū)ο蠖x一個(gè)方法徙邻。該方法會(huì)因?yàn)镾tring.prototype.replace方法的使用而被調(diào)用排嫌,用于處理當(dāng)字符串使用該正則表達(dá)式或?qū)ο笞鳛樘鎿Q標(biāo)志時(shí)的內(nèi)部處理邏輯 |
Symbol.search | 用于為正則表達(dá)式或?qū)ο蠖x一個(gè)方法。該方法會(huì)因?yàn)镾tring.prototype.replace方法的使用而被調(diào)用缰犁,用于處理當(dāng)字符串使用該正則表達(dá)式或?qū)ο笞鳛槲恢盟饕龢?biāo)志時(shí)的內(nèi)部處理邏輯 |
Symbol.split | 用于為正則表達(dá)式或?qū)ο蠖x一個(gè)方法淳地。該方法會(huì)因?yàn)镾tring.prototype.replace方法的使用而被調(diào)用,用于處理當(dāng)字符串使用該正則表達(dá)式或?qū)ο笞鳛榉指顦?biāo)志時(shí)的內(nèi)部處理邏輯 |
Symbol.unscopables | 用于為對(duì)象定義一個(gè)屬性帅容。該屬性用于決定該對(duì)象中哪些屬性是可以被with語句所使用的 |
Symbol.isConcatSpreadable | 用于對(duì)對(duì)西那個(gè)定義一個(gè)屬性薇芝。該屬性用于決定該對(duì)西那個(gè)作為Array.prototype.concat()方法的參數(shù)時(shí),是否會(huì)被展開 |
Symbol.species | 用于為類定義定義一個(gè)靜態(tài)屬性丰嘉。該屬性用于決定該類的默認(rèn)構(gòu)建函數(shù) |
Symbol.toPrimitive | 用于為對(duì)象定義一個(gè)方法夯到。該方法會(huì)在該對(duì)象需要轉(zhuǎn)換為值類型的時(shí)候被調(diào)用,可以根據(jù)程序的行為決定該對(duì)象需要被轉(zhuǎn)換成的值 |
Symbol.toStringTag | 用于為類定義一個(gè)屬性饮亏。該屬性可以決定這個(gè)類的實(shí)例在調(diào)用toString方法時(shí)耍贾,其中的標(biāo)簽內(nèi)容 |
1. Symbol.iterator
es6標(biāo)準(zhǔn)定義了可迭代對(duì)象和新的for-of循環(huán)語句,其中可迭代對(duì)象不是一種類型路幸,而是帶有@@iterator屬性和可以被for-of循環(huán)語句所遍歷的對(duì)象統(tǒng)稱荐开。
定義一個(gè)可迭代對(duì)象
可迭代對(duì)象都會(huì)使用Symbol.iterator作為方法名的方法屬性,該方法會(huì)返回一個(gè)迭代器
/**
* 迭代器是一個(gè)含有next方法的對(duì)象
* next方法返回一個(gè)迭代狀態(tài)對(duì)象简肴,含有value與done值
* 最后一次返回狀態(tài)值為undefined
/
let obj = {
[Symbol.iterator]() {
return {
next() {
return {
value: 'value',
done: false,
}
}
}
}
}
2. Symbol.hasInstance
對(duì)象的Symbol.hasInstance屬性晃听,指向一個(gè)內(nèi)部方法。當(dāng)其他對(duì)象使用instanceof運(yùn)算符砰识,判斷是否為該對(duì)象的實(shí)例時(shí)能扒,會(huì)調(diào)用這個(gè)方法
3. Symbol.match
對(duì)象的Symbol.match屬性,指向一個(gè)函數(shù)辫狼。當(dāng)執(zhí)行str.match(myObject)時(shí)初斑,如果該屬性存在,會(huì)調(diào)用它膨处,返回該方法的返回值见秤。