WeakSet
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015.
WeakSet
オブジェクトは、コレクションに弱く参照されたオブジェクトを格納することができます。
解説
WeakSet
オブジェクトはコレクションオブジェクトです。 Set
と同様に、 WeakSet
内の各オブジェクトは一度だけ存在します。すなわち、 WeakSet
コレクション内で固有になります。
Set
オブジェクトとの主な違いは下記の通りです。
-
WeakSet
はオブジェクトのみのコレクションです。Set
のように、任意の型の自由な値を入れることはできません。 -
WeakSet
は弱い参照です。コレクション内のオブジェクトへの弱い参照で保持されます。WeakSet
内に格納されているオブジェクトへの参照が他にない場合、ガベージコレクションにより削除されます。メモ: これは、このコレクションに格納されているオブジェクトの現在のリストが存在しないことを意味します。
WeakSets
は列挙可能ではありません。
使用例: 循環参照の検出
自分自身を再帰的に呼び出す関数は、どのオブジェクトが処理済みであるかを追跡することで、循環したデータ構造を防ぐ必要があります。
WeakSet
はこの目的に理想的です。
// Execute a callback on everything stored inside an object
function execRecursively(fn, subject, _refs = null) {
if (!_refs) _refs = new WeakSet();
// Avoid infinite recursion
if (_refs.has(subject)) return;
fn(subject);
if ("object" === typeof subject) {
_refs.add(subject);
for (let key in subject) execRecursively(fn, subject[key], _refs);
}
}
const foo = {
foo: "Foo",
bar: {
bar: "Bar",
},
};
foo.bar.baz = foo; // Circular reference!
execRecursively((obj) => console.log(obj), foo);
ここで、 WeakSet
は最初の実行時に作成され、その後の関数呼び出しのたびに (内部の _refs
引数を使用して) 渡されます。
オブジェクトの数や探索順序は重要ではないので、オブジェクトの参照を追跡するには WeakSet
のほうが Set
よりも、特に巨大な数のオブジェクトを処理する場合にはよりふさわしい (そして性能もよい) ものです。
コンストラクター
WeakSet()
-
新しい
WeakSet
オブジェクトを生成します。
インスタンスメソッド
WeakSet.prototype.add(value)
-
value
をWeakSet
オブジェクトに追加します。 WeakSet.prototype.delete(value)
-
value
をWeakSet
オブジェクトから削除します。削除後、WeakSet.prototype.has(value)
はfalse
を返します。 WeakSet.prototype.has(value)
-
value
がWeakSet
オブジェクト内の要素に含まれているかどうかを示す論理値を返します。
例
WeakSet オブジェクトの使用
const ws = new WeakSet();
const foo = {};
const bar = {};
ws.add(foo);
ws.add(bar);
ws.has(foo); // true
ws.has(bar); // true
ws.delete(foo); // foo を set から削除
ws.has(foo); // false, foo は削除済み
ws.has(bar); // true, bar は残っている
foo !== bar
であることに注意してください。これらは似たオブジェクトですが、まったく同じオブジェクトではありません。したがって、両方のオブジェクトが set に追加されます。
仕様書
Specification |
---|
ECMAScript Language Specification # sec-weakset-objects |
ブラウザーの互換性
BCD tables only load in the browser