簡體   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