我正在我的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?然后参考丢失但尺寸没有改变。
答案 0 :(得分:1)
在最后一行,如果大小没有改变,为什么会返回false?
它返回size = 1
,因为它仍然保存一个值(对该对象的引用)。
它会返回false
,因为它没有等于null
的值。
但是,如果我使用下一个代码删除对象的引用:
您只需覆盖变量的值即可。之后,仍有一个对象的引用(在Set内)。
要从Set
中删除元素,您需要使用Set.prototype.delete()
方法:
set1.delete(obj);
大概你需要这样做,而obj
仍然拥有对象的引用。
答案 1 :(得分:1)
当您覆盖 obj 的值时:
obj = null;
您只是更改 obj 的值,而不是 Set 条目的值,该条目仍保留对最初分配给 obj <的对象的引用/ em>的
所以目前的状态是:
obj: null
set1: [
{} // the object assigned to obj
]
所以你的行
console.log(set1.has(obj));
实际测试,如果 set1 包含 null :
console.log(set1.has(null));
当然是假的(因为它只包含对象)。
要从集合中实际删除对象,您可以使用:
set1.delete(obj);
你也可以使用weakSet,如果set中的引用仅用于对该对象的引用仍然存在于其他地方。