Apply your JS skills to key Mozilla projects as an MDN Fellow! http://mzl.la/MDNFellowship

mozilla
您的搜索结果

    WeakMap

    该特性目前仍处于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) Not supported Not supported Not supported
    clear() Not supported 20.0 (20.0) Not supported Not supported Not supported
    Feature Android Firefox Mobile (SpiderMonkey) IE Mobile Opera Mobile Safari Mobile
    Basic support Not supported 6.0 (6.0) Not supported Not supported Not supported
    clear() Not supported 20.0 (20.0) Not supported Not supported Not supported

    相关链接

    文档标签和贡献者

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