繁体   English   中英

EcmaScript6:带有WeakSet参数的console.log的奇怪行为

[英]EcmaScript6: strange behavior of console.log with WeakSet argument

如何解释以下内容:如果我们首先调用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 )情况下添加一个console.log( mySet ) (到脚本的末尾)。 [[Entries]].length0

其中一位评论员提到它应该是垃圾收集器。 但它在真实剧本中的表现如何呢? 如果我将使用一次调用该对象(没有第二次)它是否会被删除(在将对象设置为null )?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM