From 1f7cb6cf7a83b3ad37ef014b72759c7f4d0b9782 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 15 Feb 2015 23:50:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9weakmap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/set-map.md | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/docs/set-map.md b/docs/set-map.md index 51023e4..5fa928e 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -644,18 +644,16 @@ var wm = new WeakMap(); var element = document.querySelector(".element"); wm.set(element, "Original"); - -var value = wm.get(element); -console.log(value); // "Original" +wm.get(element) // "Original" element.parentNode.removeChild(element); element = null; - -value = wm.get(element); -console.log(value); // undefined +wm.get(element) // undefined ``` +上面代码中,变量wm是一个WeakMap实例,我们将一个DOM节点element作为键名,然后销毁这个节点,element对应的键就自动消失了,再引用这个键名就返回undefined。 + WeakMap与Map在API上的区别主要是两个,一是没有遍历操作(即没有key()、values()和entries()方法),也没有size属性;二是无法清空,即不支持clear方法。这与WeakMap的键不被计入引用、被垃圾回收机制忽略有关。因此,WeakMap只有四个方法可用:get()、set()、has()、delete()。 ```javascript @@ -670,7 +668,26 @@ wm.forEach ``` -WeakMap的一个用处是部署私有属性。 +前文说过,WeakMap应用的典型场合就是DOM节点作为键名。下面是一个例子。 + +```javascript + +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++; + myWeakmap.set(myElement, logoData); +}, false); + +``` + +上面代码中,myElement是一个DOM节点,每当发生click事件,就更新一下状态。我们将这个状态作为键值放在WeakMap里,对应的键名就是myElement。一旦这个DOM节点删除,该状态就会自动消失,不存在内存泄漏风险。 + +WeakMap的另一个用处是部署私有属性。 ```javascript