WeakMap

2 位贡献者:

该特性处于 ECMAScript 6 规范草案中,目前的实现在未来可能会发生微调,请谨慎使用。

概述

WeakMap对象就是简单的键/值映射.但键只能是对象值,不可以是原始值.

API

方法 描述
myWeakMap.get(key [, defaultValue]) 返回键key关联的值,如果该键不存在则返回默认值defaultValue.
myWeakMap.set(key, value) 设置键keymyWeakMap中的值. 返回 undefined.
myWeakMap.has(key) 返回一个布尔值来表明键key是否在myWeakMap 中.
myWeakMap.delete(key) 删除键 key 及对应的值. 在这之后, myWeakMap.has(key)将返回 false.
myWeakMap.clear() 清空myWeakMap中的所有键值对,返回undefined.

例子

var wm1 = new WeakMap(),
    wm2 = new WeakMap(),
    wm3 = new WeakMap();
var o1 = {},
    o2 = function(){},
    o3 = window;

wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // value可以是任意值,包括一个对象
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // 键和值可以是任意对象,甚至另外一个WeakMap对象
wm1.get(o2); // "azerty"
wm2.get(o2); // undefined,wm2中没有o2这个键
wm2.get(o3); // undefined,值就是undefined

wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (即使值是undefined)

wm3.set(o1, 37);
wm3.get(o1); // 37
wm3.clear();
wm3.get(o1); // undefined,wm3已被清空
wm1.has(o1);   // true
wm1.delete(o1);
wm1.has(o1);   // false

为什么要使用WeakMap?

经验丰富的JavaScript程序员会注意到,WeakMap完全可以通过两个数组(一个存放键,一个存放值)来实现.但这样的实现会有两个很大的缺点,首先是O(n)的时间复杂度(n是键值对的个数).另外一个则可能会导致内存泄漏:在这种自己实现的WeakMap中,存放键的数组中的每个索引将会保持对所引用对象的引用,阻止他们被当作垃圾回收.而在原生的WeakMap中,每个键对自己所引用对象的引用是 "弱引用", 这意味着,如果没有其他引用和该键引用同一个对象,这个对象将会被当作垃圾回收.

正由于这样的弱引用, WeakMap 的keys是无法遍历的 (无法列举出所有的keys). 如果允许被遍历的话, 遍历的结果将会受垃圾回收的影响, 从而得到不确定的结果. 因此,如果你想得到所有keys的值,你应该自己管理他们. 另外ECMAScript提案中还介绍了另外两种集合类型,MapSet,他们没有使用弱引用,所以是可遍历的.

规范

Specification Status Comment
EcmaScript Language Specification Draft 6th Edition Draft  

浏览器兼容性

Feature Chrome Firefox (SpiderMonkey) Internet Explorer Opera Safari
Basic support (Yes)[1] 6.0 (6.0) 未实现 未实现 未实现
clear() 未实现 20.0 (20.0) 未实现 未实现 未实现
Feature Android Firefox Mobile (SpiderMonkey) IE Mobile Opera Mobile Safari Mobile
Basic support 未实现 6.0 (6.0) 未实现 未实现 未实现
clear() 未实现 20.0 (20.0) 未实现 未实现 未实现

相关链接

文档标签和贡献者

向此页面作出贡献: teoli, ziyunfei
最后编辑者: teoli,