EcmaScript5 中的 WeakMap 实现?

     2023-02-22     77

关键词:

【中文标题】EcmaScript5 中的 WeakMap 实现?【英文标题】:WeakMap implementation in EcmaScript5? 【发布时间】:2013-04-28 06:36:48 【问题描述】:

我遇到了一个在 ES5 中实现跨浏览器 WeakMap 的 JavaScript library。 (WeakMap 计划用于 ES6。)

如果没有 JavaScript 语言本身的支持,这怎么可能工作?

编辑:为了清楚起见,我指的是Weak地图,而不是常规地图。我使用 Chrome 的分析器测试了这个项目,并且密钥不是由强引用持有的。他们无需从 WeakMap 中删除即可获得 GC。

【问题讨论】:

考虑研究源码。 @squint 它正在做一些相当深入的事情——我无法弄清楚它是如何没有对键进行强引用的。例如,它不使用数组。 WeakMaps 是一个 ES6 功能,它允许您将数据与对象相关联,但当对象或 WeakMap 实例本身被垃圾收集时,仍然让该数据被垃圾收集。如果没有语言支持,就不可能做到这两点。大多数 WeakMap 垫片忽略了当 WeakMap 实例本身被 GC 时让数据被 GC 的部分。 【参考方案1】:

我花了一些时间来摸索代码,但后来我突然想到了:键本身用于存储对值的引用。

例如,将几层放入set 就可以了

defProp(obj, globalID,  value: store );

其中defProp 已定义为Object.definePropertyobj 是键,globalID 是 guid,store 是包含值的存储对象。

然后在get 中查找值

obj[globalID];

这很聪明。 WeakMap 实际上并不包含对任何东西(弱或其他)的引用——它只是设置了一个秘密存储值的策略。使用Object.defineProperty 意味着您不会意外发现值存储——您必须知道魔法指南才能查找它。

由于键直接引用值(而 WeakMap 不引用它),当所有对键的引用都消失时,它会像往常一样被 GC。

【讨论】:

如果obj是WeakMap键,globalID是在obj上定义的,我想知道为什么globalID在使用Object.getOwnPropertyNames()时没有出现。 我也有同样的疑惑;太糟糕了,lib 远远落后于它自己,以至于几乎无法阅读。必须有一个更简单的解释...... 想通了:lib 作弊:它重新定义了 Object.getOwnPropertyNames()。 boo 用于踩踏现有的原生函数。 它只重新定义 getOwnPropertyNames 以实现 WeakMap。它不会破坏任何东西,并且getOwnPropertyNames' 功能保持不变。该环境与 ES5 完全向后兼容,并与 ES6 WeakMaps 完全向前兼容。这真是个好主意。我在Secrets 中使用它达到了同样的效果。 垫片不提供 WeakMap 的主要属性之一:该值被弱保存。这个 shim 在键和值之间创建了一个强引用......类似于将值设置为键对象的属性。

javascript中的weakmap和weakset(代码片段)

WeakMap的key不能是基本类型letweakMap=newWeakMap();letobj=;weakMap.set(obj,"ok");//worksfine(objectkey)//can'tuseastringasthekeyweakMap.set("test","Whoops");//Error,because"test"isnotanobject如果key指向了null,则key会被自动回收letj... 查看详情

对象和数组的 ECMAScript5 深拷贝

】对象和数组的ECMAScript5深拷贝【英文标题】:ECMAScript5deepcopyofobjectandarrays【发布时间】:2011-12-2621:53:23【问题描述】:我希望找到一个示例代码来对ECMAScript5中的对象进行深度复制。复制应该可以克隆嵌套对象嵌套数组数组中... 查看详情

ecmascript5中的数据属性和访问器属性

简介ECMAScript定义的对象中有两种特殊的属性,这两种特殊的属性在你定义对象属性时就会赋予,我们在必要时可以改写这两种特殊的属性让其属性的访问更加的合理化,这两种特殊的属性称呼及作用如下:数据属性:通过对数... 查看详情

weakmap(代码片段)

WeakMap结构与Map结构类似,用于生成键值对的集合。//WeakMap可以使用set方法添加成员constwm1=newWeakMap();constkey=foo:1;wm1.set(key,2);wm1.get(key)//2//WeakMap也可以接受一个数组,//作为构造函数的参数constk1=[1,2,3];constk2=[4,5,6];constwm2=newWeakMap([[k1... 查看详情

ecmascript5新增对象语法糖getter和setter

在新的ECMAScript5中新添加了两个语法糖,这两个语法糖是这样的。varobj=(function(){varnum=10;return{getn(){returnnum;},setn(v){num=v;}};}());console.log(obj.n);obj.n=20;console.log(obj.n);get表示读取某个值,实际上get和set的实现就是一个函数,注意这两个... 查看详情

ES6 WeakMap 的实际用途是啥?

】ES6WeakMap的实际用途是啥?【英文标题】:WhataretheactualusesofES6WeakMap?ES6WeakMap的实际用途是什么?【发布时间】:2015-06-0710:10:40【问题描述】:ECMAScript6中引入的WeakMap数据结构的实际用途是什么?由于弱映射的键创建了对其对应... 查看详情

javascriptweakmap(代码片段)

文章目录前言一、为何选用WeakMap1.Map2.WeakMap二、WeakMap原型方法总结前言我在处理一个复杂对象的深拷贝方法时接触到WeakMap,其作为缓存结构以解决对象内部的循环引用问题.为了改造这个方法,决定研究WeakMap.一、为何选用WeakMapWeak... 查看详情

map和weakmap数据结构

Map和WeakMap是ES6新增的数据结构一、Map它们本质与对象一样,都是键值对的集合,但是他们与Object对象主要的不同是,键可以是各种类型的数值,而Object对象的键只能是字符串类型或者Symbol类型值,Map和WeakMap是更为完善的Hash结构... 查看详情

javascript(ecmascript5)的细节和违反直觉的地方

记录在学习Javascript(ECMAScript5)中的一些与其他语言的不同之处,本文会不断更新。里面的知识可能并不太适合有一定经验的Javascript程序员,仅仅但不限于给初学者阅读。  1.null是一个表示“空”的对象指针varfoo=nullconsol... 查看详情

javascript(ecmascript5)的细节和违反直觉的地方

记录在学习Javascript(ECMAScript5)中的一些与其他语言的不同之处,本文会不断更新。里面的知识可能并不太适合有一定经验的Javascript程序员,仅仅但不限于给初学者阅读。  1.null是一个表示“空”的对象指针varfoo=nullconsol... 查看详情

关于ecmascript5数组的新增方法。

forEach  forEach是ES5新方法中最基本的一个,就是遍历,循环。类似for arr.forEach(function(value,index,array){})  value--遍历的数组内容  index--对应的数组索引  array--数组本身  这时同学发现了forEach方法跟jQuery中的$.each()方法... 查看详情

《javascript高级程序设计》学习笔记|6.5.weakmap

关注前端小讴,阅读更多原创技术文章WeakMapWeakMap是ECMAScript6的新增特性,是一种新的集合类型,是Map的“兄弟”类型,也是Map的子集“weak”描述的是JS垃圾回收程序对待“弱映射”中键的方式相关代码→基本API使用new关键字和We... 查看详情

ecmascript5新增数组内函数(代码片段)

indexOf() 格式:数组.indexOf(item,start) 功能:从start这个下标开始,查找item在数组中的第一次出现的下标。 参数:item我们要去查找的元素 start从哪个下标开始去查找,如果不传,默认从0开始查找 返回值:-1没有找到 ... 查看详情

TypeScript 找不到名称 Weakmap、Map 等

】TypeScript找不到名称Weakmap、Map等【英文标题】:TypeScriptcannotFindnameWeakmap,Map,etc【发布时间】:2018-12-1013:54:22【问题描述】:我想到了Angular教程,并有这个ts和webpack配置这里是tsconfig"compilerOptions":"target":"es5","module":"es2015","moduleRes... 查看详情

浅析map和weakmap区别以及使用场景(代码片段)

在阅读红宝书时遇到了WeakMap这个关键字,第一次见感觉没啥用,是我见识浅了,其实还是有点用的,有多大我不知道(快跑)希望这一篇文章能让你对Map有更好的理解,或者能够帮你理解Map和WeakMap这... 查看详情

浅析map和weakmap区别以及使用场景(代码片段)

在阅读红宝书时遇到了WeakMap这个关键字,第一次见感觉没啥用,是我见识浅了,其实还是有点用的,有多大我不知道(快跑)希望这一篇文章能让你对Map有更好的理解,或者能够帮你理解Map和WeakMap这... 查看详情

ecmascript5对象

对象的创建和销毁都在JavaScript执行过程中发生。把对象的所有引用都设置为null,可以强制性地废除对象。在ECMAScript中,所有对象并非同等创建的。一、对象类型一般来说,可以创建并使用的对象有三种:本地对象、内置对象和... 查看详情

javascriptweakmap(代码片段)

文章目录前言一、为何选用WeakMap1.Map2.WeakMap二、WeakMap原型方法总结前言我在处理一个复杂对象的深拷贝方法时接触到WeakMap,其作为缓存结构以解决对象内部的循环引用问题.为了改造这个方法,决定研究WeakMap.一、为何选用WeakMapWeak... 查看详情