首頁  >  文章  >  web前端  >  ES6之WeakMap解決記憶體洩漏

ES6之WeakMap解決記憶體洩漏

小云云
小云云原創
2018-03-12 09:09:101614瀏覽

本文主要跟大家介紹了詳解ES6透過WeakMap解決記憶體洩漏問題,小編覺得挺不錯的,現在分享給大家,希望能幫助大家。

一、Map

1.定義

Map物件保存鍵值對,類似資料結構字典;與傳統上的物件只能用字串當鍵不同,Map物件可以使用任意值當鍵。

2.語法

new Map([iterable])

屬性

size:傳回鍵值對的數量。

操作方法

  1. set(key, value):設定(新增/更新)鍵key的值為value,傳回Map物件。

  2. get(key):讀取鍵key的值,沒有則回傳undefined。

  3. has(key):判斷一個Map物件中是否存在某個鍵值對,回傳true/false。

  4. delete(key):刪除某個鍵值對,回傳true/false。

  5. clear():清除Map物件中所有鍵值對。

遍歷方法

  1. keys():傳回鍵名的Iterator物件。

  2. values():傳回鍵值的Iterator物件。

  3. entries():傳回鍵值對的Iterator物件。

  4. forEach((value, key, map) => {}):遍歷Map物件所有鍵值對。

3.範例

操作方法

let m = new Map([
  ['foo', 11],
  ['bar', 22]
]);
m.set('mazey', 322)
  .set('mazey', 413);
console.log(m); // {"foo" => 11, "bar" => 22, "mazey" => 413}
console.log(m.has('mazey')); // true
m.delete('mazey');
console.log(m.has('mazey')); // false
m.clear();
console.log(m); // {}

遍歷方法

let m = new Map([
  ['foo', 11],
  ['bar', 22],
  ['mazey', 413]
]);
console.log(m); // {"foo" => 11, "bar" => 22, "mazey" => 413}
console.log(m.keys()); // MapIterator {"foo", "bar", "mazey"}
console.log(m.values()); // MapIterator {11, 22, 413}
console.log(m.entries()); // MapIterator {"foo" => 11, "bar" => 22, "mazey" => 413}
m.forEach((value, key, map) => {
  console.log("键:%s,值:%s", key, value);
});
// 键:foo,值:11
// 键:bar,值:22
// 键:mazey,值:413

二、WeakMap

1.定義

WeakMap物件保存鍵值對,與Map不同的是其鍵必須是對象,因為鍵是弱引用,在鍵對象消失後自動釋放記憶體。

2.語法

new WeakMap([iterable])

方法

  1. #set(key, 值):設定(新增/更新)鍵key的值為value,返回WeakMap物件。

  2. get(key):讀取鍵key的值,沒有則回傳undefined。

  3. has(key):判斷一個WeakMap物件中是否存在某個鍵值對,傳回true/false。

  4. delete(key):刪除某個鍵值對,回傳true/false。

注意

因為WeakMap的特殊的垃圾回收機制,所以沒有clear()方法。

3.範例

let obj = {
  foo: 11
};
let wm = new WeakMap();
wm.set(obj, 413322);
console.log(wm); // {{…} => 413322}
console.log(wm.has(obj)); // true

三、透過WeakMap解決記憶體洩漏問題

當使用Dom物件綁定事件時,Dom物件消失後若沒有及時釋放記憶體(置null),便會一直存在記憶體中。

使用WeakMap儲存Dom物件不會有這樣的問題,因為Dom物件消失後,JS的垃圾回收機製會自動釋放其所佔用的記憶體。

<button type="button" id="btn">按钮</button>
<script>
let wm = new WeakMap();
let btn = document.querySelector(&#39;#btn&#39;);
wm.set(btn, {count: 0});
btn.addEventListener(&#39;click&#39;, () => {
  let v = wm.get(btn);
  v.count++;
  console.log(wm.get(btn).count);
});
// 1 2 3 4 5...
</script>

相關建議:

JavaScript記憶體洩漏的處理方式實例分享

JavaScript 程式中記憶體洩漏的圖文程式碼詳細介紹

JavaScript記憶體洩漏的處理方式

以上是ES6之WeakMap解決記憶體洩漏的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn