2016-05-07 30 views
3

我存储我的JavaScript内部对象的引用设置:JavaScript的套装失去了参考,但不会改变大小

let set1 = new Set(); 
let obj = {}; 

然后,如果我使用有()方法和设置对象,我得到的大小属性下一个结果:

console.log(set1.size) //it returns 1 
console.log(set1.has(obj)) //it returns true 

但是,如果删除使用下一个代码中的对象的参考:

obj = null; 

的ñ奇怪的行为发生在我身上:

console.log(set1.size); //it returns 1 because they are Hard Sets. 
console.log(set1.has(obj)); //it returns false 

在最后一行,为什么它返回false,如果大小没有改变?然后,参考文献丢失,但大小没有改变。

+2

你不“删除引用”,你只是覆盖变量的值。 'Set'仍然保持对象的引用(为什么不会) – zerkms

+0

谢谢@zerkms,我该如何完全删除对象来影响这个Set? – frankfullstack

+1

您需要使用该套件的“删除”功能。 'set1.delete(obj);' – zerkms

回答

1

在最后一行,如果大小没有改变,为什么它返回false?

它返回size = 1,因为它仍然保存一个值(对该对象的引用)。

它返回false,因为它没有等于null的值。

但是,如果我删除使用下一个代码的对象的引用:

你只覆盖变量的值。之后,仍然有一个引用剩下的对象(在Set中)。

要从你需要使用Set.prototype.delete()方法Set删除一个元素:

set1.delete(obj); 

想必你需要做的是,虽然obj仍持有该对象的引用。

+0

谢谢@zerkms它解决了这个问题。我认为在Object引用的Set对象中使用'has()'方法时,它返回了我们更新的内部查询值。然后我想我需要使用'Set.prototype.delete()'函数删除对象本身和引用。 – frankfullstack

1

当你重写的OBJ值:

obj = null; 

你只改变不的设置项下,仍保持到作为对象的引用OBJ值,最初分配给obj

所以目前的状态是:

obj: null 
set1: [ 
    {} // the object assigned to obj 
] 

所以你行

console.log(set1.has(obj)); 

实际测试,如果设置1包含

console.log(set1.has(null)); 

这当然是错误(因为它只包含ns对象)。

要真正删除集中的对象,你可以使用:

set1.delete(obj); 

你也可以使用一个weakSet,如果在只设定参考使用,只要参照该对象仍然存在别的地方。

+0

感谢@nils,但什么是更好的方式来删除对象内容和集内的参考?或者是使用WeakSets更好的选择? – frankfullstack

+1

您可以简单地使用* set1.delete(obj); *如果集合中的引用只用于* obj *中的引用仍然存在,那么您可以使用weakSet。 – nils