在之前的文章圈浇,提到了Map與Set的區(qū)別切省。所以在本篇文章中,將談下WeakSet與WeakMap的區(qū)別蛔六,并且將這4個(gè)一起做個(gè)比對(duì)荆永。
一废亭、WeakSet
WeakSet 對(duì)象允許將弱引用對(duì)象儲(chǔ)存在一個(gè)集合中。什么是弱引用對(duì)象具钥?就是:垃圾回收機(jī)制不考慮對(duì)該對(duì)象的引用豆村,也就是說(shuō),如果其他對(duì)象都不再引用該對(duì)象骂删,那么垃圾回收機(jī)制會(huì)自動(dòng)回收該對(duì)象所占用的內(nèi)存掌动,不考慮該對(duì)象是否還在該弱引用的結(jié)構(gòu)中。要注意的是宁玫,弱引用的對(duì)象不可遍歷粗恢。
WeakSet具有以下方法:
add(value): 在 WeakSet 對(duì)象中添加一個(gè)元素value
has(value): 判斷WeakSet 對(duì)象中是否包含value
delete(value): 刪除元素value
let ws = new WeakSet()
let obj = {}
let foo = {}
ws.add(window)
ws.add(obj)
ws.has(window) // true
ws.has(obj) // true
ws.has(foo) // false
ws.delete(window) // true
ws.delete(window) // false
WeakSet 與 Set 的區(qū)別:
1、WeakSet 只能儲(chǔ)存對(duì)象引用欧瘪,不能存放值眷射,而 Set 對(duì)象都可以。
2恋追、WeakSet 對(duì)象中儲(chǔ)存的對(duì)象值都是被弱引用的凭迹,則這個(gè)對(duì)象將會(huì)被垃圾回收掉(不考慮該對(duì)象還存放于 WeakSet 中),所以 WeakSet 對(duì)象里有多少個(gè)成員元素苦囱,取決于垃圾回收機(jī)制有沒(méi)有運(yùn)行嗅绸,運(yùn)行前后成員個(gè)數(shù)可能不一致,遍歷結(jié)束之后撕彤,有的成員可能被垃圾回收了鱼鸠。
3、WeakSet 對(duì)象是無(wú)法被遍歷的(ES6 規(guī)定 WeakSet 不可遍歷)羹铅,也沒(méi)有辦法拿到它包含的所有元素蚀狰。
二、WeakMap
WeakMap 對(duì)象是一組鍵值對(duì)的集合职员,其中的鍵是弱引用對(duì)象麻蹋,而值可以是任意。
WeakMap 中焊切,每個(gè)鍵對(duì)自己所引用對(duì)象的引用都是弱引用扮授,在沒(méi)有其他引用和該鍵引用同一對(duì)象,這個(gè)對(duì)象將會(huì)被垃圾回收(相應(yīng)的key則變成無(wú)效的)专肪,所以刹勃,WeakMap 的 key 是不可枚舉的。
注:WeakMap 弱引用的只是鍵名嚎尤,而不是鍵值荔仁。鍵值依然是正常引用。
WeakMap具有以下方法:
has(key):判斷是否有 key 關(guān)聯(lián)對(duì)象
get(key):返回key關(guān)聯(lián)對(duì)象(沒(méi)有則則返回 undefined)
set(key):設(shè)置一組key關(guān)聯(lián)對(duì)象
delete(key):移除 key 的關(guān)聯(lián)對(duì)象
let myElement = document.getElementById('logo');
let myWeakmap = new WeakMap();
myWeakmap.set(myElement, {timesClicked: 0});
myElement.addEventListener('click', function() {
let logoData = myWeakmap.get(myElement);
logoData.timesClicked++;
}, false);
三、Set乏梁、Map次洼、WeakSet和WeakMap的區(qū)別總結(jié)
1、Set
成員唯一遇骑、無(wú)序且不重復(fù)滓玖;
[value, value],鍵值與鍵名是一致的(或者說(shuō)只有鍵值质蕉,沒(méi)有鍵名)势篡;
可以遍歷,方法有:add模暗、delete禁悠、has;
2兑宇、WeakSet
成員都是對(duì)象碍侦;
成員都是弱引用,可以被垃圾回收機(jī)制回收隶糕,可以用來(lái)保存DOM節(jié)點(diǎn)瓷产,不容易造成內(nèi)存泄漏;
不能遍歷枚驻,方法有add濒旦、delete、has再登;
3尔邓、Map
本質(zhì)上是鍵值對(duì)的集合,類似集合锉矢;
可以遍歷梯嗽,方法很多可以跟各種數(shù)據(jù)格式轉(zhuǎn)換;
4沽损、WeakMap
只接受對(duì)象作為鍵名(null除外)灯节,不接受其他類型的值作為鍵名;
鍵名是弱引用绵估,鍵值可以是任意的炎疆,鍵名所指向的對(duì)象可以被垃圾回收,此時(shí)鍵名是無(wú)效的壹士;
不能遍歷磷雇,方法有g(shù)et偿警、set躏救、has、delete;
需要查看Map與Set的區(qū)別盒使,見(jiàn)上一篇文章崩掘。:)