资讯专栏INFORMATION COLUMN

解读 webconponents.js 中对 ES6 WeakMap 的 shim (一)

Imfan / 875人阅读

摘要:中对的要求主要是对非对象仅保留弱引用,且取值是复杂度,这导致了它的两个特性不能求大小,更不能枚举。按说这种关乎内存管理的对象是没法的。但是对有一个很奇妙的。在中的每一个中设置一个属性属性名是的唯一。值为该在中对应的。同时取值也是复杂度的。

ES6 中对 WeakMap 的要求主要是对 key(非 null 对象) 仅保留弱引用,且取值是 O(1) 复杂度,这导致了它的两个特性:

不能求大小,更不能枚举。

当 key 对象不被其他变量引用时,会被垃圾回收系统回收。

按说这种关乎内存管理的对象是没法 shim 的。但是webcomponents.js 对 WeakMap 有一个很奇妙的 shim。经过阅读后整理原理如图:

解说:

WeakMap 内不提供存储 key 和 value 的区域,避免产生本对象对 key 的强引用。

每个 WeakMap 中只存储一个随机、唯一生成的 name 字符串。

在 WeakMap 中的每一个 key 中设置一个属性:

属性名是 WeakMap 的唯一 name。

值为该 key 在 WeakMap 中对应的 value。

此时,获取 WeakMap 中指定 key 对应的 value,就等价于获取 key 中的 WeakMap::name 属性的值。

为了防止由于原型继承导致 WeakMap::name 属性不是本对象自有的属性,采用了一个技巧来保证获取 WeakMap::name 属性的值不是从原型继承来的,这个技巧作为另一个文章再谈。

虽然使用 Object::hasOwnProperty 也可以达到相同的效果,但是从库的级别考虑,该属性可能被第三方代码污染,所以采用了更极端的方式来验证。

通过这种引用方式,达成了 WeakMap 对象事实上没有引用到 key 对象的效果,那么当 key 对象不被别的变量引用时,就会被垃圾回收系统自动回收。同时取值也是 O(1) 复杂度的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85523.html

相关文章

  • es 知识点解读

    摘要:返回的遍历器对象,可以依次遍历函数内部的每一个状态。以后,每次调用遍历器对象的方法,就会返回一个有着和两个属性的对象。由于函数就是遍历器生成函数,因此可以把赋值给对象的属性,从而使得该对象具有接口。 let 和 const 作用域的概念 全局作用域 函数作用域 块作用域如何使用let和const 使用let 1、形成块级作用域2、es6下强制开启严格模式,而在es5下,需要use ...

    LoftySoul 评论0 收藏0
  • ES6特性概述 - ES6 - ECMAScript特性 - Javascript核心

    摘要:特性概述比较新特性更多。之后后分篇描述目前已经比较成熟的语法特性例如和。同上,但返回该元素的索引号。和对象的属性行为一致。不将参数强制转行为。判断是否为在范围内的正整数。不少层面的特性可以通过进行兼容性支持。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_api_extension.html 源...

    Ali_ 评论0 收藏0
  • ES6 - WeakMap

    Set有对应的WeakSet, Map也有WeakMap。这一篇,我们就来学习一下WeakMap有写什么特性。先来看一下WeakMap的基本特性: 1: WeakMap是一种存储多个键值对的无序列表 2: WeakMap的键必须是非null的对象类型 3: WeakMap的键对应的值,可以是任意类型 接下来看一下WeakMap的接口方法:一:WeakMap的新建与初始化与Map相同的,WeakM...

    Youngdze 评论0 收藏0
  • ES6 系列之 WeakMap

    摘要:一个对象若只被弱引用所引用,则被认为是不可访问或弱可访问的,并因此可能在任何时刻被回收。也就是说,一旦不再需要,里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。如果有错误或者不严谨的地方,请务必给予指正,十分感谢。 前言 我们先从 WeakMap 的特性说起,然后聊聊 WeakMap 的一些应用场景。 特性 1. WeakMap 只接受对象作为键名 const map = ...

    CollinPeng 评论0 收藏0
  • 面试题里那些各种手写

    摘要:最近准备初级前端面试,发现有很多手写实现什么的,例如什么手写实现,。后面以这道题为引线面试官可能会追问什么是执行上下文的判断,的区别手写一个函数实现斐波那契数列首先拷一个阮神在他教程里的一个写法。 最近准备初级前端面试,发现有很多手写实现什么的,例如什么手写实现bind,promise。手写ajax,手写一些算法。翻阅了很多书籍和博客。 这里做一个总结改进,算是对我后面大概为期一个月找...

    wh469012917 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<