Javascript 引用散列
Javascript reference hashing
我有一个对象:
var myObject = {myKey: myVal};
我想将一些元数据归因于此对象,而无需直接编辑该对象。例如,假设我想向该对象添加一个标签"myTag"。我可以通过创建一个将标签与对象列表匹配的新对象来做到这一点的一种方法:
var tags = {
'myTag': [myObject, someOtherObject, ...],
'myTag2': [otherObject, myObject, ...]
}
问题是,如果我遇到对该对象的另一个引用并想知道其现有标签是什么,我必须遍历整个标签列表,看看每个数组中是否有对该对象的引用。随着标签和对象引用列表的增长,这将变得非常昂贵。
我一直在寻找某种"哈希"对象引用的方法,这样我就可以翻转它的标签列表,如下所示:
var tags = {
myObject: ['myTag', 'myTag2']
}
但是由于对象引用不能用作键,因此我找不到任何干净的方法来考虑性能来实现此目的。关于如何处理这个问题的任何想法?
在 ES6 中,您可以使用允许对象成为键的weakMap
。 因此,您可以直接将对象存储在map
、weakMap
或set
中,而无需修改对象。
在 ES5 中,对象不能是键,因此您必须向对象添加一个属性,该属性可用作对象的句柄。 如果不编辑对象,则无法执行此操作。 附加的属性可以设置为只读且不可枚举(因此大多数代码看不到它(。这是对 ES5 中对象的影响最小。
这种添加已知属性的技术,该属性分配了某种唯一值以跟踪给定对象,这正是我们在 ES6 中使用 weakMap 之前人们为解决此问题所做的。
此 Set polyfill(旨在尽可能接近地模拟 ES6 实现,但在 ES5 中工作(允许您将对象添加到 Set 并使用所描述的解决方法。 如果检查该代码中的 getKey()
函数,则可以看到一种技术,该技术在对象上使用已知属性名称,然后根据对象的类型使用计数器和前缀来为该特定对象创建唯一标识符。 然后,该键以不可枚举、不可配置、不可写的方式附加到对象,使其成为对象的唯一标识符,通常只有知道要查找的内容的人才能看到。
从那时起,任何查看该对象的人都可以检查附加到它的标识符,并将其与以前的某个标识符进行比较,以查看这是否确实是同一对象。 当然,标识符本身可以存储在某个查找表中,而不会创建对此对象的任何不需要的引用(因为标识符只是一个字符串(。
- 为什么我可以引用Javascript中尚未定义的变量
- 有没有一种方法可以通过只引用JavaScript来执行代码
- 什么's使用链接和脚本标记引用JavaScript源之间的区别
- 引用Javascript中的索引集合
- 通过引用Javascript中的另一个函数来传递对象方法
- 如何从onclick字符串中引用javascript对象函数
- 在jquery事件中引用javascript对象
- 通过动态创建数组名称在单击函数中引用 javascript 数组
- 引用javascript嵌入资源,但intellisense没有'我什么也不展示
- 对象属性引用JavaScript中的其他对象属性
- 引用JavaScript变量
- 如何通过引用(javascript)从数组中删除对象
- 我的无引用 JavaScript 对象存在在哪里以及存在多长时间
- 引用javascript对象内的另一个字段
- 如何在启动之前引用javascript窗口元素
- Google Drive是否不再允许从其他网站引用JavaScript文件
- XUL不引用javascript文件
- 我们可以在浏览器会话中跨网页引用 JavaScript 变量吗?
- 如何查找哪些ASPX文件实际引用JavaScript文件
- 从 Jasmine 测试中引用 JavaScript 文件