[英]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]].length
為0
。
其中一位評論員提到它應該是垃圾收集器。 但它在真實劇本中的表現如何呢? 如果我將使用一次調用該對象(沒有第二次)它是否會被刪除(在將對象設置為null
)?
這一點都不奇怪,它只是弱集合的標准行為。 [[Entries]]是一個內部插槽,具有很多與實現相關的行為,甚至可能在實際實現中不存在,只是在調試器中顯示。
一旦覆蓋對象的key
引用,它就可以被垃圾收集,也不會被mySet
。 console.log
的自定義行為顯然會創建對該對象的另一個引用(因為您仍然可以在控制台中與它進行交互),因此它不會被垃圾收集,並且仍會顯示在列表中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.