ES5 中的 Set 與 Map
????Set 與 Map 并不正式存在于 ES5 中侥蒙。一般會(huì)使用對(duì)象來模擬 Set 和 Map 慌核。
變通方法的問題
????由于對(duì)象屬性的類型必須為字符串谈跛,就必須保證任意兩個(gè)鍵不能被轉(zhuǎn)換為相同的字符串蜕猫。比如數(shù)字和數(shù)字組成的字符串箫措、兩個(gè)對(duì)象等腹备。
ES6 的 Set
????ES6 新增了 Set 類型,這是一種無重復(fù)值的有序列表斤蔓。 Set 允許對(duì)它包含的數(shù)據(jù)進(jìn)行快速訪問植酥,從而增加了一個(gè)追蹤離散值的更有效方式。
創(chuàng)建 Set 并添加項(xiàng)目
? ??Object.is()方法來判斷兩個(gè)值是否相等的弦牡,所以不會(huì)強(qiáng)制轉(zhuǎn)換友驮。(對(duì)象與之相同)
????可以使用 has() 方法來測試某個(gè)值是否存在于 Set 中。
移除值
????可以使用 delete() 方法來移除單個(gè)值驾锰,或調(diào)用 clear() 方法來將所有值從 Set 中移除卸留。
Set 上的 forEach() 方法
????forEach() 方法會(huì)被傳遞一個(gè)回調(diào)函數(shù),該回調(diào)接受三個(gè)參數(shù):
????????1. Set 中下個(gè)位置的值椭豫;
????????2. 與第一個(gè)參數(shù)相同的值耻瑟;
????????3. 目標(biāo) Set 自身。
如果想在回調(diào)函數(shù)中使用this赏酥,可以在forEach()中傳入第二個(gè)參數(shù)this喳整。或者使用箭頭函數(shù)裸扶。
將 Set 轉(zhuǎn)換為數(shù)組
? ? Set 無法通過索引來訪問某個(gè)值框都。不過可以將其轉(zhuǎn)化成數(shù)組,利用擴(kuò)展運(yùn)算符...
Weak Set
????對(duì)象存儲(chǔ)在 Set 的一個(gè)實(shí)例中時(shí)姓言,實(shí)際上相當(dāng)于把對(duì)象存儲(chǔ)在變量中瞬项。只要對(duì)于 Set 實(shí)例的引用仍然存在,所存儲(chǔ)的對(duì)象就無法被垃圾回收機(jī)制回收何荚,從而無法釋放內(nèi)存。
????ES6 也包含了 Weak Set 猪杭,該類型只允許存儲(chǔ)對(duì)象弱引用餐塘,而不能存儲(chǔ)基本類型的值。對(duì)象的弱引用在它自己成為該對(duì)象的唯一引用時(shí)皂吮,不會(huì)阻止垃圾回收戒傻。
創(chuàng)建 Weak Set
Set 類型之間的關(guān)鍵差異
????Weak Set 與正規(guī) Set 之間最大的區(qū)別是對(duì)象的弱引用税手。若只想追蹤對(duì)象的引用,應(yīng)當(dāng)使用 Weak Set 而不是正規(guī) Set 需纳。
????????1. 對(duì)于 WeakSet 的實(shí)例芦倒,若調(diào)用 add() 方法時(shí)傳入了非對(duì)象的參數(shù),就會(huì)拋出錯(cuò)誤(has() 或 delete() 則會(huì)在傳入了非對(duì)象的參數(shù)時(shí)返回 false )不翩;
????????2. Weak Set 不可迭代兵扬,因此不能被用在 for-of 循環(huán)中;
????????3. Weak Set 無法暴露出任何迭代器(例如 keys() 與 values() 方法)口蝠,因此沒有任何編程手段可用于判斷 Weak Set 的內(nèi)容器钟;
????????4. Weak Set 沒有 forEach() 方法;
????????5. Weak Set 沒有 size 屬性妙蔗。
ES6 的 Map
????ES6 的 Map 類型是鍵值對(duì)的有序列表傲霸,而鍵和值都可以是任意類型。鍵的比較使用的是Object.is()眉反。
????set() 方法并給它傳遞一個(gè)鍵與一個(gè)關(guān)聯(lián)的值昙啄,來給 Map 添加項(xiàng); get() 方法便能提取對(duì)應(yīng)的值寸五。
Map 的方法
????????has(key) :判斷指定的鍵是否存在于 Map 中跟衅;
????????delete(key) :移除 Map 中的鍵以及對(duì)應(yīng)的值;
????????clear() :移除 Map 中所有的鍵與對(duì)應(yīng)的值播歼。
? ??????size 屬性伶跷,用于指明包含了多少個(gè)鍵值對(duì)
Map 的初始化
Map 上的 forEach 方法
? ? 三個(gè)參數(shù)的回調(diào)函數(shù):
????????1. Map 中下個(gè)位置的值;
????????2. 該值所對(duì)應(yīng)的鍵秘狞;
????????3. 目標(biāo) Map 自身叭莫。
Weak Map
????在 Weak Map 中,所有的鍵都必須是對(duì)象(嘗試使用非對(duì)象的鍵會(huì)拋出錯(cuò)誤)烁试,而且這些對(duì)象都是弱引用雇初,不會(huì)干擾垃圾回收。當(dāng) Weak Map 中的鍵在 Weak Map 之外不存在引用時(shí)减响,該鍵值對(duì)會(huì)被移除靖诗。
使用 Weak Map
Weak Map 的初始化
Weak Map 的方法
????Weak Map 只有兩個(gè)附加方法能用來與鍵值對(duì)交互。has() 與 delete() 方法支示。
對(duì)象的私有數(shù)據(jù)
????Weak Map 的一個(gè)實(shí)際應(yīng)用就是在對(duì)象實(shí)例中存儲(chǔ)私有數(shù)據(jù)刊橘。
Weak Map 的用法與局限性
????是否使用非對(duì)象的鍵。