JavaScript集失去了引用,但没有';不要改变大小

JavaScript集失去了引用,但没有';不要改变大小,javascript,object,reference,set,Javascript,Object,Reference,Set,我正在JavaScript集中存储对象引用: let set1 = new Set(); let obj = {}; 然后,如果我使用has()方法和Set对象的size属性,我会得到下一个结果: console.log(set1.size) //it returns 1 console.log(set1.has(obj)) //it returns true 但是,如果我使用下一个代码删除对象的引用: obj = null; 然后奇怪的行为发生在我身上: console.log(set

我正在JavaScript集中存储对象引用:

let set1 = new Set();
let obj  = {};
然后,如果我使用has()方法和Set对象的size属性,我会得到下一个结果:

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?然后,引用将丢失,但大小不会更改

在最后一行中,如果大小没有更改,为什么返回false

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

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

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

obj = null;
您只需覆盖变量的一个值。之后,仍然有一个对对象的引用(在集合内)

要从
集合中删除元素,需要使用以下方法:


假设您需要这样做,而
obj
仍保留对对象的引用。

当您覆盖obj的值时:

您只更改obj的值,而不更改集合项的值,集合项仍保留对最初指定给obj的对象的引用

因此,目前的状况是:

obj: null
set1: [
   {} // the object assigned to obj
]
那你的台词呢

console.log(set1.has(obj));
实际测试,如果set1包含null:

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

要从集合中实际删除对象,可以使用:

set1.delete(obj);

如果集合中的引用仅在对该对象的引用仍然存在于其他地方时才使用,则也可以使用弱集。

如果不“删除引用”,则只覆盖变量的值<代码>集合
仍然保留其对对象的引用(为什么不保留)感谢@zerkms,我如何才能完全删除对象以影响此集合?您需要使用集合的
删除
功能<代码>设置1.删除(obj)谢谢@nils,但是删除集合中的对象内容和引用的更好方法是什么?或者使用weakset是更好的选择吗?您可以简单地使用set1.delete(obj);如果中的集合中的引用仅在obj中的引用仍然存在的情况下使用,则可以使用weakSet。感谢@zerkms,它解决了这个问题。我认为当对象引用上的Set对象使用
has()
方法时,它会返回更新的内部查询值。然后我想我需要使用
Set.prototype.delete()
函数删除对象本身和引用。
console.log(set1.has(null));
set1.delete(obj);