Symbol
ES6引入了一種新的原始數(shù)據(jù)類型Symbol
,表示獨(dú)一無二的值.
Symbol值通過Symbol
函數(shù)生成.對象的屬性名現(xiàn)在可以有兩種方式,一種是原始字符串,另一種就是新增的Symbol類型.
注意:Symbol
函數(shù)前不能使用new
命令,因?yàn)樯傻腟ymbol值是一份原始類型的值.基本上,它是一種類似于字符串的數(shù)據(jù)類型.
Symbol
函數(shù)可以接受一個字符串作為參數(shù),表示對Symbol實(shí)例的描述.如果Symbol的參數(shù)是一個對象,就會調(diào)用該對象的toString
方法
Symbol值不能與其他類型的值進(jìn)行運(yùn)算,但是,可以顯示String()
轉(zhuǎn)為字符串,另外,也可以轉(zhuǎn)為布爾值,但是不能轉(zhuǎn)為數(shù)值
作為屬性名的Symbol
Symbol值作為對象屬性名時,不能用點(diǎn)運(yùn)算符,同樣,在對象內(nèi)部,使用Symbol值定義屬性時,Symbol值必須放在方括號里面.
常量使用Symbol值最大的好處就是其他任何值都不可能有相同的值了.
Symbol值作為屬性名時,該屬性還是公開屬性,不是私有舒心.
屬性名的遍歷
Symbol作為屬性名,只能使用Object.getOwnPropertySymbols
方法獲取指定對象的所有Symbol屬性名
另外一個新的API,Reflect.ownKeys
方法可以返回所有類型的鍵名,包括常規(guī)鍵名和Symbol鍵名
Symbol.for()及Symbol.keyFor()
重新使用同一個Symbol值,Symbol.for
接受一個字符串作為參數(shù),然后搜索有沒有以該參數(shù)作為名稱的Symbol值.如果有,就返回這個Symbol值,否則就新建并返回一個以該字符串為名稱的Symbol值.
Symbol.keyFor
方法返回一個已登記的Symbol類型值的key
內(nèi)置的Symbol值
- Symbol.hasInstance
對象的Symbol.hasInstance
屬性指向一個內(nèi)部方法,當(dāng)其他對象使用instance
運(yùn)算符,判斷是否為該對象的實(shí)例時,會調(diào)用這個方法. - Symbol.isConcatSpreadable
布爾值,表示該對象用于Array.prototype.concat()
時,是否可以展開 - Symbol.species
對象的Symbol.species
屬性,指向一個構(gòu)造函數(shù).創(chuàng)建衍生對象時,會使用該屬性.
定義Symbol.species
屬性要采用get
取值器. - Symbol.match
指向一個函數(shù).當(dāng)執(zhí)行str.match(myObject)
時,如果該屬性存在,會調(diào)用他,返回該方法的返回值. - Symbol.replace
指向一個方法,當(dāng)該對象被String.prototype.replace
方法調(diào)用時,會返回該方法的返回值 - Symbol.search
指向一個方法,當(dāng)該對象被String.prototype.search
方法調(diào)用時,會返回該方法的返回值 - Symbol.split
指向一個方法,當(dāng)該對象被String.prototype.split
方法調(diào)用時,會返回該方法的返回值 - Symbol.iterator
對象的Symbol.iterator
屬性,指向該對象的默認(rèn)遍歷器方法 - Symbol.toPrimitive
指向一個方法,當(dāng)該對象被轉(zhuǎn)化為原始類型的值時,會返回該方法的返回值
被調(diào)用時,會接受一個字符串參數(shù),表示當(dāng)前運(yùn)算的模式:Number,String,Default - Symbol.toStringTag
指向一個方法,當(dāng)該對象被String.prototype.toString
方法調(diào)用時,可以用來定制[object xxx]
中object后面的那個字符串 - Symbol.unscopables
指向一個對象,該對象指定了使用with
關(guān)鍵字時,那些屬性會被with
環(huán)境排除(with語句的作用是將代碼的作用域設(shè)置到一個特定的作用域中)