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 に追加されます。
仕様書
| 仕様書 |
|---|
| ECMAScript (ECMA-262) WeakSet の定義 |
ブラウザーの互換性
このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、 https://github.com/mdn/browser-compat-data をチェックアウトしてプルリクエストを送信してください。
Update compatibility data on GitHub
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
WeakSet | Chrome 完全対応 36 | Edge 完全対応 12 | Firefox 完全対応 34 | IE 未対応 なし | Opera 完全対応 23 | Safari 完全対応 9 | WebView Android 完全対応 37 | Chrome Android 完全対応 36 | Firefox Android 完全対応 34 | Opera Android 完全対応 24 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
WeakSet() constructor | Chrome 完全対応 36 | Edge 完全対応 12 | Firefox 完全対応 34 | IE 未対応 なし | Opera 完全対応 23 | Safari 完全対応 9 | WebView Android 完全対応 37 | Chrome Android 完全対応 36 | Firefox Android 完全対応 34 | Opera Android 完全対応 24 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
add | Chrome 完全対応 36 | Edge 完全対応 12 | Firefox 完全対応 34 | IE 未対応 なし | Opera 完全対応 23 | Safari 完全対応 9 | WebView Android 完全対応 37 | Chrome Android 完全対応 36 | Firefox Android 完全対応 34 | Opera Android 完全対応 24 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
clear | Chrome 未対応 36 — 41 | Edge 未対応 なし | Firefox 未対応 34 — 46 | IE 未対応 なし | Opera 未対応 23 — 28 | Safari 未対応 なし | WebView Android 未対応 37 — 41 | Chrome Android 未対応 36 — 41 | Firefox Android 未対応 34 — 46 | Opera Android 未対応 24 — 28 | Safari iOS 未対応 なし | Samsung Internet Android 未対応 3.0 — 4.0 | nodejs 未対応 なし |
delete | Chrome 完全対応 36 | Edge 完全対応 12 | Firefox 完全対応 34 | IE 未対応 なし | Opera 完全対応 23 | Safari 完全対応 9 | WebView Android 完全対応 37 | Chrome Android 完全対応 36 | Firefox Android 完全対応 34 | Opera Android 完全対応 24 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
has | Chrome 完全対応 36 | Edge 完全対応 12 | Firefox 完全対応 34 | IE 未対応 なし | Opera 完全対応 23 | Safari 完全対応 9 | WebView Android 完全対応 37 | Chrome Android 完全対応 36 | Firefox Android 完全対応 34 | Opera Android 完全対応 24 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 0.12 |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非推奨。新しいウェブサイトでは使用しないでください。
- 非推奨。新しいウェブサイトでは使用しないでください。