1. 程式人生 > 其它 >大前端JS篇之搞懂【WeakSet】

大前端JS篇之搞懂【WeakSet】

和Set一樣,WeakSet也是es6新增的一種資料結構,那麼它和Set有什麼區別呢?

WeakSet對比Set主要是兩個區別:

  1. WeakSet只能放置物件,不能是其他任何型別
  2. WeakSet裡面的儲存的都是對物件的弱引用

這裡我們理解下什麼叫對物件的弱引用,也就是說js的垃圾回收機制不會考慮WeakSet裡面的物件,如果裡面的物件在外面沒有被引用,垃圾回收機制會回收該物件,不會考慮這些物件是否存在於WeakSet中。這就使得我們可以利用WeakSet來存放一些臨時物件,而不用考慮後面這些物件如果不用了忘記清空產生記憶體洩漏的問題

WeakSet有三個方法:

  1. WeakSet.prototype.add(value):新增物件
  2. WeakSet.prototype.delete(value): 刪除物件
  3. WeakSet.prototype.has(value):判斷某個物件是否存在
const wset = new WeakSet()

const a = {}
const b= {}

wset.add(a)
wset.add(b)

wset.delete(a)

wset.has(b)

注意的是WeakSet沒有size屬性和forEach方法,沒法進行遍歷,因為儲存的都是物件的弱引用,可能何時這些物件的引用就會不存在了。

WeakSet 的一個使用場景就是用來儲存dom節點,不用擔心dom節點從文件中移除產生記憶體洩漏的問題