Symbol函数
Symbol函數(shù)
- 概述
- Symbol.prototype.description
- 作為屬性名
- 消除魔術(shù)字符串
- 屬性名的遍歷
- Symbol.for(),Symbol.keyFor()
- 實(shí)例:模塊的 Singleton 模式
- 內(nèi)置的 Symbol 值
概述
ES6 引入了一種新的原始數(shù)據(jù)類型Symbol,表示獨(dú)一無(wú)二的值。它是 JavaScript 語(yǔ)言的第七種數(shù)據(jù)類型,前六種是:undefined、null、布爾值(Boolean)、字符串(String)、數(shù)值(Number)、對(duì)象(Object)。
通過(guò)Symbol函數(shù)生成
Symbol函數(shù)前不能使用new命令,否則會(huì)報(bào)錯(cuò)。這是因?yàn)樯傻?Symbol 是一個(gè)原始類型的值,不是對(duì)象。也就是說(shuō),由于 Symbol 值不是對(duì)象,所以不能添加屬性。基本上,它是一種類似于字符串的數(shù)據(jù)類型。
Symbol函數(shù)的參數(shù)只是表示對(duì)當(dāng)前 Symbol 值的描述,因此相同參數(shù)的Symbol函數(shù)的返回值是不相等的。
// 沒(méi)有參數(shù)的情況 let s1 = Symbol(); let s2 = Symbol();s1 === s2 // false// 有參數(shù)的情況 let s1 = Symbol('foo'); let s2 = Symbol('foo');s1 === s2 // false如果 Symbol 的參數(shù)是一個(gè)對(duì)象,就會(huì)調(diào)用該對(duì)象的toString方法,將其轉(zhuǎn)為字符串,然后才生成一個(gè) Symbol 值。
Symbol 值不能與其他類型的值進(jìn)行運(yùn)算,會(huì)報(bào)錯(cuò)。
Symbol 值可以顯式轉(zhuǎn)為字符串,調(diào)用.toString()
可以轉(zhuǎn)換為布爾值
Symbol.prototype.description
const sym = Symbol('foo');sym.description // "foo"作為屬性名
每一個(gè) Symbol 值都是不相等的,這意味著 Symbol 值可以作為標(biāo)識(shí)符,用于對(duì)象的屬性名
let mySymbol = Symbol();// 第一種寫法 let a = {}; a[mySymbol] = 'Hello!';// 第二種寫法 let a = {[mySymbol]: 'Hello!' };// 第三種寫法 let a = {}; Object.defineProperty(a, mySymbol, { value: 'Hello!' });// 以上寫法都得到同樣結(jié)果 a[mySymbol] // "Hello!"注意,Symbol 值作為對(duì)象屬性名時(shí),不能用點(diǎn)運(yùn)算符。
const mySymbol = Symbol(); const a = {};a.mySymbol = 'Hello!'; a[mySymbol] // undefined a['mySymbol'] // "Hello!"點(diǎn)運(yùn)算符后面總是字符串,所以不會(huì)讀取mySymbol作為標(biāo)識(shí)名所指代的那個(gè)值,導(dǎo)致a的屬性名實(shí)際上是一個(gè)字符串 ‘mySymbol’,而不是一個(gè) Symbol 值
在對(duì)象的內(nèi)部,使用 Symbol 值定義屬性時(shí),Symbol 值必須放在方括號(hào)之中
消除魔術(shù)字符串
魔術(shù)字符串指的是,在代碼之中多次出現(xiàn)、與代碼形成強(qiáng)耦合的某一個(gè)具體的字符串或者數(shù)值。
屬性名的遍歷
Symbol 作為屬性名,遍歷對(duì)象的時(shí)候,該屬性不會(huì)出現(xiàn)在for…in、for…of循環(huán)中,也不會(huì)被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
Object.getOwnPropertySymbols()方法,可以獲取指定對(duì)象的所有 Symbol 屬性名。該方法返回一個(gè)數(shù)組,成員是當(dāng)前對(duì)象的所有用作屬性名的 Symbol 值。
Reflect.ownKeys()方法可以返回所有類型的鍵名,包括常規(guī)鍵名和 Symbol 鍵名。
以利用這個(gè)特性,為對(duì)象定義一些非私有的、但又希望只用于內(nèi)部的方法。
Symbol.for(),Symbol.keyFor()
Symbol.for()方法可以做到這一點(diǎn)。它接受一個(gè)字符串作為參數(shù),然后搜索有沒(méi)有以該參數(shù)作為名稱的 Symbol 值。如果有,就返回這個(gè) Symbol 值,否則就新建一個(gè)以該字符串為名稱的 Symbol 值,并將其注冊(cè)到全局
let s1 = Symbol.for('foo'); let s2 = Symbol.for('foo');s1 === s2 // trueSymbol.for("bar") === Symbol.for("bar") // trueSymbol("bar") === Symbol("bar") // falseSymbol()寫法沒(méi)有登記機(jī)制,所以每次調(diào)用都會(huì)返回一個(gè)不同的值
Symbol.keyFor()方法返回一個(gè)已登記的 Symbol 類型值的key。
let s1 = Symbol.for("foo");//Symbol.for()為 Symbol 值登記的名字,是全局環(huán)境的 Symbol.keyFor(s1) // "foo"let s2 = Symbol("foo");//未登記的 Symbol 值 Symbol.keyFor(s2) // undefined*Symbol.for()的這個(gè)全局登記特性,可以用在不同的 iframe 或 service worker 中取到同一個(gè)值
*
實(shí)例:模塊的 Singleton 模式
Singleton 模式指的是調(diào)用一個(gè)類,任何時(shí)候返回的都是同一個(gè)實(shí)例。
內(nèi)置的 Symbol 值
11 個(gè)內(nèi)置的 Symbol
Symbol.hasInstance屬性,指向一個(gè)內(nèi)部方法,其他對(duì)象使用instanceof運(yùn)算符,判斷是否為該對(duì)象的實(shí)例時(shí),會(huì)調(diào)用這個(gè)方法。比如,foo instanceof Foo在語(yǔ)言內(nèi)部,實(shí)際調(diào)用的是FooSymbol.hasInstance。
.isConcatSpreadable屬性等于一個(gè)布爾值,表示該對(duì)象用于Array.prototype.concat()時(shí),是否可以展開(kāi)
數(shù)組的默認(rèn)行為是可以展開(kāi),Symbol.isConcatSpreadable默認(rèn)等于undefined。該屬性等于true時(shí),也有展開(kāi)的效果。
類似數(shù)組的對(duì)象正好相反,默認(rèn)不展開(kāi)。它的Symbol.isConcatSpreadable屬性設(shè)為true,才可以展開(kāi)。
Symbol.species屬性,指向一個(gè)構(gòu)造函數(shù)。創(chuàng)建衍生對(duì)象時(shí),會(huì)使用該屬性
Symbol.match
Symbol.replace
Symbol.toStringTag屬性,指向一個(gè)方法。在該對(duì)象上面調(diào)用Object.prototype.toString方法時(shí),如果這個(gè)屬性存在,它的返回值會(huì)出現(xiàn)在toString方法返回的字符串之中,表示對(duì)象的類型。也就是說(shuō),這個(gè)屬性可以用來(lái)定制[object Object]或[object Array]中object后面的那個(gè)字符串。
Symbol.unscopables屬性,指向一個(gè)對(duì)象。該對(duì)象指定了使用with關(guān)鍵字時(shí),哪些屬性會(huì)被with環(huán)境排除。
總結(jié)
- 上一篇: 利用zui上传excel文件,并通过ja
- 下一篇: 万有引力索源