如何解释以下内容:
如果我们对第一次调用console.log发表评论,那么set.[[Entries]].length
将是1
,如果没有评论set.[[Entries]].length
= 0
;
输出:长度= 0;
let mySet = new WeakSet(),
key = {};
mySet.add( key ); // add the object to the set
//console.log( mySet ); // uncommenting will change the [[Entries]].length
key = null; // delete key
console.log( mySet ); // [[Entries]].length: 0
输出:长度= 1
let mySet = new WeakSet(),
key = {};
mySet.add( key ); // add the object to the set
console.log( mySet ); // commenting will change the [[Entries]].length
key = null; // delete key
console.log( mySet ); // [[Entries]].length: 1
还有一个版本:如果我们在第二种情况下添加一个console.log( mySet )
(到脚本的末尾)。 [[Entries]].length
将为0
。
其中一位评论员提到它应该是垃圾收集器。但它在真实剧本中的表现如何呢?如果我使用一次调用该对象(没有第二次)它是否会被删除(在将对象设置为null
之后)?
答案 0 :(得分:2)
这一点都不奇怪,它只是弱集合的标准行为。 [[Entries]]是一个内部插槽,具有很多与实现相关的行为,甚至可能不存在于实际实现中,只是在调试器中显示。
覆盖对象的key
引用后,它可能会被垃圾收集,也不会被mySet
保留。 console.log
的自定义行为显然会创建对该对象的另一个引用(因为您仍然可以在控制台中与它进行交互),因此它不会被垃圾收集,并且仍会显示在列表中。