ES6入門筆記(五)

ES6引入了一種新的原始數(shù)據(jù)類型Symbol,表示讀一無二的值,它是js語言的第七種數(shù)據(jù)類型,前六種undefined、null、Boolean、String、Number、Object

Symbol值通過Symbol函數(shù)生成,這就是說對象的屬性名現(xiàn)在可以有兩種數(shù)據(jù)類型,一種是原來就有的字符串,另一種就是新增的Symbol類型。凡是屬性名屬于Symbol類型,就都屬于獨一無二的,這樣保證不會與其他屬性名產(chǎn)生沖突

Symbol函數(shù)不能使用new命令,否則會報錯。這是因為生成的Symbol是一個原始類型的值,不是對象

Symbol函數(shù)可以接受一個字符串作為參數(shù),表示對Symbol實例的描述,主要是為了在控制臺顯示,或者轉(zhuǎn)為字符串,比較容易區(qū)分

如果Symbol的參數(shù)是一個對象,就會調(diào)用該對象的toString方法,將其轉(zhuǎn)為字符串,然后才生成一個Symbol值

Symbol函數(shù)的參數(shù)只是表示對當(dāng)前Symbol值得秒搜狐,因此相同參數(shù)的Symbol函數(shù)的返回值實不相等的

Symbol值不能與其他類型的值進行運算,會報錯,但是可以顯式地轉(zhuǎn)為字符串也可以轉(zhuǎn)為數(shù)值

作為屬性名的Symbol

每一個Symbol值都是不相等,這意味著Symbol值可以作為標識符,用于對象的屬性名,就能保證不會出現(xiàn)同名的屬性。

不能用點運算符

在對象內(nèi)部,使用Symbol值定義屬性時,Symbol值必須放在方括號之中

魔術(shù)字符串:在代碼多次多次出現(xiàn)、與代碼形成強耦合的某一個具體的字符串或者數(shù)值

Triangle字符串多次出現(xiàn)
把Triangle寫成shapeType對象的triangle屬性,這樣就消除了強耦合

屬性名的遍歷

Symbol作為屬性名,該屬性不會出現(xiàn)在for...in、for...of循環(huán)中。但是,它也不是私有屬性,有一個Object.getOwnPropertySymbols方法,可以獲取指定對象所有的Symbol屬性名。Object.getOwnPropertySymbols方法返回一個數(shù)組,成員是當(dāng)前對象的所有用作屬性名的Symbol值


reflect.ownKeys方法返回所有類型的鍵名,包括常規(guī)鍵名和Symbol鍵名

由于Symbol值作為名稱的屬性,不會被常規(guī)方法遍歷得到。我們可以利用這個特性,為對象定義一些非私有的但又希望只用于內(nèi)部的方法

5、Symbol .for,Symbol.keyFor()

Symbol.for方法可以做到重新使用用一個Symbol值。

Symbol.for()與Symbol()這兩種寫法,都會生成新的Symbol。它們的區(qū)別是,前者會被登記在全局環(huán)境中供搜索,后者不會。Symbol.for()不會每次調(diào)用就會返回一個新的SYmbol類型的值,而是會先檢查給定的key是否已經(jīng)存在,如果不存在才會新建一個值

Symbol.keyFor方法返回一個已登記的Symbol類型值的key

s2沒有被登記

6、實例:模塊Singleton模式

Singleton模式指的是調(diào)用一個類,任何時候返回的都是同一個實例

7、內(nèi)置的Symbol值

除了定義自己使用的Symbol值以外,ES6提供了11個內(nèi)置的Symbol值,指向語言內(nèi)部使用的方法

1)Symbol.hasInstance屬性,指向一個內(nèi)部方法。當(dāng)其他對象使用instanceof運算符,判斷是否為該對象的實例時,會調(diào)用這個方法

2)Symbol.isConcatSpreadable

對象的Symbol.isConcatSpreadable屬性等于一個布爾值,表示該對象使用Array.prototype.concat()時,是否可以展開

3)Symbol.species

對象的Symbol.species屬性,指向當(dāng)前對象的構(gòu)造函數(shù)。創(chuàng)造實例時,默認會調(diào)用這個方法,即使用這個屬性返回的函數(shù)當(dāng)做構(gòu)造函數(shù)來創(chuàng)造新的實例對象

4)Symbol.match()

指向一個函數(shù),當(dāng)執(zhí)行str.match(myObject)時,如果該屬性存在,會用它,返回該方法的返回值

5)Symbol.replace

對象的Symbol.replace屬性,指向一個方法,當(dāng)該對象被String.prototype.replace方法調(diào)用時,會返回該方法的返回值

6)Symbol.search()

指向一個方法,當(dāng)該對象被String.prototype.search方法調(diào)用時,會返回該方法的返回值

7)Symbol.split

Symbol.split屬性,指向一個方法,當(dāng)該對象被String.prototype.split方法調(diào)用時,會返回該方法的返回值

8)Symbol.iterator

獨享的Symbol.iterator屬性,指向該對象的默認遍歷器方法

9)Symbol.toPrimitive

對象的Symbol.toPrimitive屬性,指向一個方法.該對象被轉(zhuǎn)為原始類型的值時,會調(diào)用這個方法,返回該對象對應(yīng)的原始類型值

10)Symbol.toStringTag

對象的Symbol.toStringTag屬性,指向一個方法

11)Symbol.unscopables

對象的Symbol.unscopables,指向一個對象。該對象指定了使用with關(guān)鍵字時,哪些屬性會被with環(huán)境排除


Set和Map數(shù)據(jù)結(jié)構(gòu)

ES6提供了新的數(shù)據(jù)結(jié)構(gòu)Set,它類似于數(shù)組,

但是成員的值都是唯一的,沒有重復(fù)的值

Set本身是一個構(gòu)造函數(shù),用來生成Set數(shù)據(jù)結(jié)構(gòu)

數(shù)組所有成員的值都是唯一的,沒有重復(fù)的值


Set函數(shù)可以接受一個數(shù)組(或類似數(shù)組的對象)作為參數(shù),用來初始化。

還可以接受類似數(shù)組的對象作為參數(shù)

向Set加入值得時候,不會發(fā)生類型轉(zhuǎn)換。Set內(nèi)不許判斷兩個值是否不同,使用的算法叫做“Same-value equality”它類似于與精確相等運算符,主要的區(qū)別是NaN等于自身,而精確相等運算符認為NaN不等于自身

另外兩個對象總是不相等的

1)Set實例的屬性和方法

屬性:

-Set.prototype.constructor:構(gòu)造函數(shù),默認就是Set函數(shù)

?-Set.prototype.size:返回Set實例的成員的總數(shù)

方法:(操作方法和遍歷方法)

操作方法:add(value)、delete(value)、has(value)、clear()

Array.from方法可以將Set結(jié)構(gòu)轉(zhuǎn)為數(shù)組

遍歷方法:

keys()返回鍵名的遍歷器;values()返回鍵值得遍歷器;entries()返回鍵值對的遍歷器,只有鍵值(鍵名和鍵值是同一個值,所以keys方法和values方法的行為完全一致)

forEach()使用回調(diào)函數(shù)遍歷每個成員。由于Set結(jié)構(gòu)沒有鍵名,Set結(jié)構(gòu)的實例的forEach方法,用于對每個成員執(zhí)行某種操作,沒有返回值。

擴展運算符和Set結(jié)構(gòu)相結(jié)合,就可以去除數(shù)組的重復(fù)成員

數(shù)組的map結(jié)構(gòu)和filter方法也可以用于Set

如果想在遍歷操作中,同步改變原來的Set結(jié)構(gòu),目前沒有直接的方法,但又兩種變通方法。一種是利用原Set結(jié)構(gòu)映射出一個新的結(jié)構(gòu),然后復(fù)制給原來的Set結(jié)構(gòu);另一種是利用Array.from方法

2、WeakSet

WeakSet結(jié)構(gòu)與Set類似,也是不重復(fù)的值得結(jié)合。但是,它與Set有兩個區(qū)別,首先,WeakSet的成員只能是對象,而不能是其他類型的值

WeakSet中的對象都是弱引用,即垃圾回收機制不考慮WeakSet對該對象的引用,也就是說,如果如果其他對象都不在引用該對象,那么垃圾回收機制會自動回收該對象所占用的內(nèi)存,不考慮該對象還存在與WeakSet之中

語法:

const ws = new WeakSet()。WeakSet是一個勾走函數(shù),可以使用new命令,創(chuàng)建WeakSet數(shù)據(jù)結(jié)構(gòu)

WeakSet可以接受一個數(shù)組或類似數(shù)組的對象作為參數(shù)。

WeakSet不能遍歷,是因為成員都是弱引用

3、Map

鍵值對的鍵只接受鍵作為鍵名,ES6提供了Map數(shù)據(jù)結(jié)構(gòu),Object結(jié)構(gòu)提供了“字符串--值”的對應(yīng),Map結(jié)構(gòu)提供了“值--值”的對應(yīng)。

Map構(gòu)造函數(shù)接受數(shù)組作為參數(shù),不僅僅是數(shù)組,任何具有Iterator接口的數(shù)據(jù)結(jié)構(gòu)都可以當(dāng)做Map構(gòu)造函數(shù)的參數(shù),這就是說Set和Map都可以用來生成新的Map。

實例的屬性和操作方法

屬性:size屬性;set(key,value)set方法設(shè)置鍵名key隊形的鍵值為value,然后返回整個Map結(jié)構(gòu)。如果key已經(jīng)有值,則鍵值會被更新,否則就生成該鍵

set方法返回的是當(dāng)前的Map對象,因此可以采用鏈式寫法

get(key)方法讀取key對應(yīng)的鍵值,如果找不到key,返回undefined

has方法返回一個布爾值,表示某個值是否在當(dāng)前Map對象之中。

delete(key)delete方法刪除某個鍵,返回true。如果刪除失敗,返回false

clear方法清除所有成員,沒有返回值

遍歷方法:

Map結(jié)構(gòu)原生提供三個遍歷器和生成函數(shù)和一個遍歷方法

-keys()返回鍵名的遍歷器;values()返回鍵值得遍歷器;-entries()返回所有成員的遍歷器;forEach()遍歷Map的所有成員

上面代碼最后的那個例子,表示Map結(jié)構(gòu)的默認遍歷器接口,就是entries方法

Map結(jié)構(gòu)轉(zhuǎn)為數(shù)組結(jié)構(gòu),比較快速的方法是使用擴展運算符

與其他數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換

1)Map轉(zhuǎn)為數(shù)組(使用擴展運算符...)

2)數(shù)組轉(zhuǎn)為Map

將數(shù)組傳入Map構(gòu)造函數(shù),就可以轉(zhuǎn)為Map

new Map([

[true,7],

[{foo:3},['abc']]

])

3)Map轉(zhuǎn)為對象,如果所有Map的鍵都是字符串,它可以轉(zhuǎn)為對象。

4)對象轉(zhuǎn)為Map

5)Map轉(zhuǎn)為JSON,分為兩種情況,一種情況是,Map的鍵名都是字符串,這是可以選擇為對象JSON

另一種情況是,Map的鍵名有非字符串,這是可以算則轉(zhuǎn)為數(shù)組JSON

6)JSON轉(zhuǎn)為Map

4、WeakMap

Weak結(jié)構(gòu)與Map結(jié)構(gòu)類似,也是用于生成鍵值對的結(jié)合

WeakMap與Map的區(qū)別

WeakMap只接受對象作為鍵名(null除外),不接受其他類型的值作為鍵名

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容