Javascript ES6 WeakMap详解

前段时间在看技术文章时看到 WeakMap 很陌生 感觉有点out了 然后了解了下

MDN上说 WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。

语法也很简单

const wp = new WeakMap();

在使用的过程中我们需要注意 WeakMap 的 key 只能是 Object 类型

// 创建一个在每个实例中存储私有变量的对象
const internal = obj => {
  if (!wp.has(obj)) {
    wp.set(obj, {});
  }
  return wp.get(obj);
}
class Shape{
  constructor(width, height) {
    internal(this).width = width;
    internal(this).height = height;
  }
  get area() {
    return internal(this).width * internal(this).height;
  }
}
const square = new Shape(10, 10);
console.log(square.area);//100
console.log(map.get(square));//根据对象获得返回值 { height: 100, width: 100 }

WeakMap 好处是在遍历属性时或者在执行 JSON.stringify 时不会展示出实例的私有属性,但它依赖于一个放在类外面的可以访问和操作的 WeakMap 变量 ,WeakMap 每个键对自己所引用对象的引用是 "弱引用", 这意味着,如果没有其他引用和该键引用同一个对象,这个对象将会被当作垃圾回收,从而得到不确定的结果。

就是说WeakMap 里面的数据可能被垃圾回收机制清除或者一个对应在WeakMap结构的对象在外部被删除时,上述情况所对应的WeakMap的键值对也会被自动被移除, 因此,如果你想要这种类型对象的 key 值的列表,你应该使用 Map。

其他

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

在上面的例子中需要注意 对象o1 经过 wm1.set(o1, 37); 并不会影响本身的值 还是为={} 只是在wm1 中形成了键值对


方法:

WeakMap.prototype.delete(key)移除key的关联对象。执行后 WeakMap.prototype.has(key)返回false。

WeakMap.prototype.get(key)返回key关联对象, 或者 undefined(没有key关联对象时)。

WeakMap.prototype.has(key)根据是否有key关联对象返回一个Boolean值。

WeakMap.prototype.set(key, value)在WeakMap中设置一组key关联对象,返回这个 WeakMap对象。

WeakMap.prototype.clear() WeakMap中移除所有的 key/value 。  (参考 WeakMap)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值