EcmaScript6:带有WeakSet参数

时间:2017-09-11 10:10:05

标签: javascript ecmascript-6

如何解释以下内容: 如果我们对第一次调用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之后)?

1 个答案:

答案 0 :(得分:2)

这一点都不奇怪,它只是集合的标准行为。 [[Entries]]是一个内部插槽,具有很多与实现相关的行为,甚至可能不存在于实际实现中,只是在调试器中显示。

覆盖对象的key引用后,它可能会被垃圾收集,也不会被mySet保留。 console.log的自定义行为显然会创建对该对象的另一个引用(因为您仍然可以在控制台中与它进行交互),因此它不会被垃圾收集,并且仍会显示在列表中。