zoukankan      html  css  js  c++  java
  • Map和WeakMap的区别

    个人总结:
    map对key强引用,当map引用了一个key的时候,(内存堆空间的)实际key内容不会被垃圾回收掉。 (有内存泄漏风险)
    weakmap对key弱引用,实际的key可能在某次垃圾回收操作时被清除掉,导致weakmap中的这对key-value也会消失掉。



    引用计数:https://zh.wikipedia.org/wiki/%E5%BC%95%E7%94%A8%E8%AE%A1%E6%95%B0
    只要存在计数,就不会被垃圾回收机制回收。

    强引用:引用并计数
    只要引用存在,垃圾回收器永远不会回收。
    弱引用:只引用 不计数
    会垃圾回收机制回收。

    强引用与弱引用本质是两种不同的指针

    在Chrome中跑下面代码:

    var map = new Map();

    {

    let x = {}

    map.set(x, 'something');

    }

    console.log(map);
     

    map是在{}这样的一个scope中定义的,scope结束后x应该被垃圾回收掉,但是map强引用了x ,所以x不会被辣鸡回收机制回收,所以这里是可以打印出map的。

    var map = new WeakMap();

    {

    let x = {}

    map.set(x, 'something');

    }

    console.log(map);
     

    WeakMap对x属于弱引用,只有引用,没有计数,当经过{}语句块时垃圾回收判断没有计数了,于是删除掉了x,所以这里打印出的map中长度是0。

    
    
    

     以上只在Chrome浏览器控制台第一次运行有效 因为垃圾回收会受有自定的引擎优化算法影响 在Edge下试了几次都保证有效 ( Microsoft Edge 42.17134.1.0 )

  • 相关阅读:
    结构型设计模式(上)
    创建型设计模式(下)
    创建型设计模式(上)
    HTTP 简述
    MVC、MVP与MVVM架构模式
    PHP 部分语法(二)
    PHP 部分语法(一)
    TypeScript 学习笔记(四)
    WORD 和Uint16的区别
    extern的用法
  • 原文地址:https://www.cnblogs.com/eret9616/p/9134548.html
Copyright © 2011-2022 走看看