Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript引用哈希_Javascript_Reference - Fatal编程技术网

Javascript引用哈希

Javascript引用哈希,javascript,reference,Javascript,Reference,我有一个目标: var myObject = {myKey: myVal}; 我想将一些元数据归于该对象,而不直接编辑该对象。例如,假设我想向该对象添加一个标记“myTag”。一种方法是创建一个新对象,将标记与对象列表相匹配: var tags = { 'myTag': [myObject, someOtherObject, ...], 'myTag2': [otherObject, myObject, ...] } 问题是,如果我遇到另一个对该对象的引用,并且想知道它现有

我有一个目标:

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之前,人们正是采用这种技术来解决这个问题的,即添加一个已知属性,并为其指定某种唯一的值来跟踪给定的对象

此集合polyfill(旨在尽可能接近ES6实现,但在ES5中工作)允许您向集合中添加对象并使用所述的变通方法。如果检查代码中的,可以看到一种技术,该技术在对象上使用已知的属性名称,然后根据对象的类型使用计数器和前缀为该特定对象生成唯一标识符。然后,该键以不可枚举、不可配置、不可写的方式附加到对象,从而使其成为对象的唯一标识符,通常只有知道要查找什么的人才能看到


从那时起,任何查看该对象的人都可以检查附加到该对象的标识符,并将其与以前的某个标识符进行比较,以确定这是否确实是同一个对象。当然,标识符本身可以存储在某些查找表中,而无需创建对此对象的任何不需要的引用(因为标识符只是一个字符串)。

您可以浏览ES6 WeakMap-ES6 Map或WeakMap允许将对象用作键。否则,您将不得不在添加属性(可能是只读的不可枚举的)或在数组中循环之间进行选择。谢谢。非常感谢,这帮了大忙。