72

WeakSet は、弱参照によって要素を格納することになっています。つまり、オブジェクトが他から参照されていない場合は、WeakSet から削除する必要があります。

私は次のテストを書きました:

var weakset = new WeakSet(),
    numbers = [1, 2, 3];

weakset.add(numbers);
weakset.add({name: "Charlie"});

console.log(weakset);

numbers = undefined;

console.log(weakset);

私の[1, 2, 3]配列は何からも参照されていませんが、WeakSet から削除されていません。コンソールに次のように出力されます。

WeakSet {[1, 2, 3], Object {name: "Charlie"}}
WeakSet {[1, 2, 3], Object {name: "Charlie"}}

何故ですか?

さらに、もう 1 つ質問があります。次のように、オブジェクトを WeakSets に直接追加するポイントは何ですか。

weakset.add({name: "Charlie"});

それらのトレーサーの不具合ですか、それとも何か不足していますか?

最後に、WeakSet を繰り返し処理することも、現在のサイズを取得することもできない場合、WeakSet の実際の使用法は何ですか?

4

7 に答える 7

1

ガベージ コレクションがまだ行われていないため、コンソールに誤った内容が表示されていた可能性があります。したがって、オブジェクトはガベージ コレクションされていないため、オブジェクトがまだ弱いセットにあることが示されます。

ウィークセットがまだ特定のオブジェクトへの参照を持っているかどうかを本当に確認したい場合は、WeakSet.prototype.has()メソッドを使用してください。このメソッドは、その名前が示すようにboolean、オブジェクトがまだウィークセットに存在するかどうかを示す値を返します。

例:

var weakset = new WeakSet(),
    numbers = [1, 2, 3];

weakset.add(numbers);
weakset.add({name: "Charlie"});

console.log(weakset.has(numbers));

numbers = undefined;

console.log(weakset.has(numbers));

于 2018-11-06T17:39:51.353 に答える