2017-09-11 5 views
2

ではconsole.logの奇妙な行動: 我々はCONSOLE.LOGする最初の呼び出しをコメントする場合は、1つは= 0set.[[Entries]].lengthをコメントされていない場合、set.[[Entries]].lengthは、1になります。EcmaScript6:以下を説明することができますかWeakSet引数

出力:長さ= 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 

Otput:長さ= 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 

もう一つの版:我々は(スクリプトの終わりに)第二の場合には1以上console.log(mySet)を追加した場合。 [[Entries]].length0になります。

コメント者の1人がガベージコレクタであると述べました。しかし、それは実際のスクリプトでどのように動作するのでしょうか?私はオブジェクトを呼び出す1回使用する場合(2回目なし)は削除されますか(オブジェクトはnullに設定された後)ですか?

+0

なぜこれが奇妙ですか?あなたはオブジェクト参照となるキーを設定しています(waaay)。その後、あなたはその参照を削除し直します。私は個人的にこの動作の説明が好きです。 – evolutionxbox

+0

@Ivar 私は変数名を変更しましたが(私はまだセッターを学んでいませんでしたが)、その変数はまだ発生しています。 コードを少し変更したので、誰でもコピーして貼り付けることができます。 –

+0

@evolutionxboxは、第2のconsole.log呼び出しのために、 'key'を' null'として割り当てた後もあります。同じ結果が出力されるはずですが、出力されません。もう一度私のexplenationを見直してください。 –

答えて

1

これはまったく変わったことではなく、弱いコレクションの標準動作です。コレクション[[Entries]]は実装に依存する動作が非常に多い内部スロットであり、実際の実装には存在せず、デバッガに表示されます。

オブジェクトへの参照をkeyに上書きすると、オブジェクトはガベージコレクションされ、mySetにも保持されません。 console.logのカスタムビヘイビアは、オブジェクトへの別の参照を(コンソールでもやり取りできるので)明らかに作成するので、ガベージコレクションされずにリストに表示されます。

+1

しかし、なぜ 'console.log'の2回目の呼び出しでガベージコレクタがその参照を削除するのですか? 第2の 'console.log'はこの場合に新しい参照を作成する必要があり、オブジェクトは存在し続けなければなりませんか? –

+0

@ VadimCherepenichev 'key = null'ステートメントの前に、オブジェクトは強く参照され、* WeakSet'になければなりません(' console.log'呼び出しがそれを見つける)。文の後で、 'key'変数がオブジェクトへの最後の参照であると仮定すると、ガベージコレクションを得ることができます。今セットをロギングするとき、オブジェクトが存在する必要があるか、再び参照可能である必要があるということは何もありません。これ以上参照がない場合、「新しい参照を作成する」ことはありません。 (もちろん、これは実装依存です。おそらく 'console.log'はGCを強制するかどうか、*は気にしないでください*)。 – Bergi

関連する問題