Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

WeakMap

该新特性属于 ECMAScript 2015(ES6)规范,在使用时请注意浏览器兼容性。

概述

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
Unknown Unknown  

浏览器兼容性

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 36 6.0 (6.0) 11 23 7.1
new WeakMap(iterable) 38 36 (36) 未实现 25 未实现
clear() 36 未实现 [1] 11 23 7.1
Constructor argument: new WeakMap(null) (Yes) 37 (37) 11 ? ?
Monkey-patched set() in constructor (Yes) 37 (37) ? ? ?
WeakMap() without new throws (Yes) 42 (42) 11 ? ?
Feature Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 35 6.0 (6.0) 未实现 未实现 8
new WeakMap(iterable) 38 36.0 (36) 未实现 未实现 未实现
clear() 35 未实现 [1] 未实现 未实现 8
Constructor argument: new WeakMap(null) ? 37.0 (37) 未实现 ? ?
Monkey-patched set() in constructor ? 37.0 (37) 未实现 ? ?
WeakMap() without new throws ? 42.0 (42) ? ? ?

相关链接

文档标签和贡献者

 此页面的贡献者: Cattla, teoli, ziyunfei
 最后编辑者: Cattla,