web-dev-qa-db-ja.com

ES6 SetとWeakSetの違いは何ですか?

ECMAScript 6には、SetWeakSetの非常によく似たコレクションがあります。それらの違いは何ですか?

15
Luboš Turek

主な違いは、Set内のオブジェクトへの参照が強いのに対し、WeakSet内のオブジェクトへの参照は弱いことです。これは、WeakSet内のオブジェクトは、他に参照がない場合にガベージコレクションされる可能性があることを意味します

その他の違い(またはむしろ副作用)は次のとおりです。

  • セットには任意の値を格納できます。 WeakSetは、オブジェクトのみのコレクションです。
  • WeakSetにはsizeプロパティがありません。
  • WeakSetには、clear、keys、values、entries、forEachメソッドがありません。
  • WeakSetは反復可能ではありません。
11
Luboš Turek

概要:

ウィークセットは、オブジェクトのコレクションを保持するjavascriptオブジェクトです。セットの性質上、同じオブジェクトの1つのオブジェクト参照のみがセット内で発生する可能性があります。ウィークセットは、次の点で通常のセットとは異なります。

  1. ウィークセットはコレクション内のオブジェクトのみを保持でき、プリミティブ値(intbooleanstringなど)は許可されません。
  2. オブジェクトへの参照は保持されます弱い。これは、WeakSet以外にオブジェクトへの参照がない場合は常に、オブジェクトをガベージコレクションできることを意味します(つまり、JSエンジンは、参照が指しているオブジェクトのメモリを解放します)。

例:

let myWeakSet = new WeakSet();
let obj = {};
myWeakSet.add(obj); 
console.log(myWeakSet.has(obj));

// break the last reference to the object we created earlier
obj = 5;

// false because no other references to the object which the weakset points to
// because weakset was the only object holding a reference it released it and got garbage collected
console.log(myWeakSet.has(obj)); 
                     
4

セット:-セットは値のコレクションであり、各値は1回だけ発生する可能性があります。そして、主な方法は、追加、削除、持っている、クリア、サイズです。

WeakSet:- WeakSetオブジェクトを使用すると、一意のキーのコレクションを格納できます。“ WeakSet”キーをプリミティブ型にすることはできません。また、配列や別のセットで作成することもできません。 WeakSetの値はオブジェクト参照である必要があります。

2
Rahul Gupta
  • セットでは、1回だけ保存できます。
  • セットに格納されている要素には、キーまたはインデックスがありません。したがって、get()のようなデフォルトのメソッドを使用して要素を取得することは困難です。
  • WeakSetは、値としてオブジェクトのみを受け入れます。
  • ウィークセットは、保存されているオブジェクトへの他の参照がない場合、ガベージコレクションを妨げません(参照が弱い)
0