美文网首页JavaScript
Map 和 WeakMap 的差异

Map 和 WeakMap 的差异

作者: CRJ997 | 来源:发表于2019-12-10 14:39 被阅读0次

    Map和WeakMap的差异啊,差了个单词呗。(好了,本文完)


    稍等,别打人,别打脸

    好了,我们来正儿八经的分析一波。

    差异
    1. 首先构造函数名不同嘛
    let map = new Map();
    let weakmap = new WeakMap();
    
    1. 内置API有差异

    Map的API有:
    (1) Map.prototype.clear()
    (2) Map.prototype.delete()
    (3) Map.prototype.entries()
    (4) Map.prototype.forEach()
    (5) Map.prototype.get()
    (6) Map.prototype.has()
    (7) Map.prototype.keys()
    (8) Map.prototype.set()
    (9) Map.prototype.values()
    (10) Map.prototype[@@iterator]()
    WeakMap的API有:
    (1) WeakMap.prototype.delete()
    (2) WeakMap.prototype.get()
    (3) WeakMap.prototype.has()
    (4) WeakMap.prototype.set()
    可以看出weakMap api少了clear, entries,forEach,keys,values,以及获取iterator对象的方法,另外weakMap还没有size属性,无法获取内部存了多少个映射。

    1. 可以用来设置键的类型

    Map可以用JS的任意类型作为键。WeakMap的话只能是对象

    let weakMap = new WeakMap();
    weakMap.set('14', '14'); // Uncaught TypeError: Invalid value used as weak map key
                             //at WeakMap.set (<anonymous>)
    
    1. GC(垃圾回收)。
    let a = {x: 12};
    let b = {y: 13};
    
    let map = new Map();
    let weakMap = new WeakMap();
    map.set(a, '14');
    weakMap.set(b, '15');
    
    a = null;
    b = null; // 设置为null提醒垃圾回收可以回收了。
    
    

    当把a, b都设置成null之后,GC会回收weakMap中的b对象对应的键值对(这里的意思是键和值都回收),也就是{ y: 13}这个对象会被回收,'14'这个常量也会被清除。但是不会回收Map中a对象对应的键值对,也就是{x: 12}这个对象并不会回收。

    WeakMap中值被回收,是因为键被回收了

    let a = {x: 12};
    let b = {y: 15};
    let weakMap = new WeakMap();
    weakMap.set(a, b);
    console.log(weakMap.get(a));
    b = null; // 这样做不会影响weakMap的存储
    console.log(weakMap.get(a));
    
    多说几句

    Map的使用,用在值需要频繁的删改的场景(map有优化),以及键只能是对象的场景比较优。如果只是简单的记录值而且键不会是对象的情况,用普通对象就OK了。

    相关文章

      网友评论

        本文标题:Map 和 WeakMap 的差异

        本文链接:https://www.haomeiwen.com/subject/jucggctx.html