首頁 >web前端 >js教程 >利用ES6透過WeakMap解決記憶體洩漏問題(詳細教學)

利用ES6透過WeakMap解決記憶體洩漏問題(詳細教學)

亚连
亚连原創
2018-05-31 15:30:281741瀏覽

本篇文章主要介紹了詳解ES6透過WeakMap解決記憶體洩漏問題,現在分享給大家,也為大家做個參考。

一、Map

1.定義

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

2.語法

new Map([iterable])

屬性

size:傳回鍵值對的數量。

操作方法

  1. set(key, 值):設定(新增/更新)鍵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>

上面是我整理給大家的,希望未來會對大家有幫助。

相關文章:

vue結合Echarts實現點擊高亮效果的範例

vue取得目前啟動路由的方法

echarts滑鼠覆蓋高亮顯示節點及關係名稱詳解

以上是利用ES6透過WeakMap解決記憶體洩漏問題(詳細教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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