JavaScript设置丢失的引用但不更改大小

时间:2016-05-07 10:35:19

标签: 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(set1.size); //it returns 1 because they are Hard Sets.
console.log(set1.has(obj)); //it returns false

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

2 个答案:

答案 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中的引用仅用于对该对象的引用仍然存在于其他地方。