WeakSet

This translation is incomplete. この記事の翻訳にご協力ください

WeakSet オブジェクトは、コレクションとして弱保持されたobjectsを格納します。

概要

コレクションとして弱保持されたobjectsを格納します。

構文

 new WeakSet([iterable]);

引数

iterable
iterable object が渡された場合、すべての要素は、新しいWeakSetに追加されます。nullはundefinedとして扱われます。

説明

WeakSetオブジェクトはコレクションオブジェクトです。WeakSet内のオブジェクトは一度だけ発生します。すなわち、WeakSetコレクション内で唯一の要素になります。

Setオブジェクトとの主な違いは下記の通りです。:

  • Setとの対比で、WeakSetsオブジェクトのみのコレクションです。すべての型の任意の値のコレクションではありません。
  • WeakSetweakです。: コレクション内のオブジェクトへの参照は弱保持です。WeakSet内に格納されているオブジェクトへの参照が他にない場合、ガベージコレクションされます。これは、コレクション内に格納されている現在のオブジェクトのリストがないことを意味します。WeakSetsは列挙されません。

Detecting circular references

Functions that call themselves recursively need a way of guarding against circular data structures by tracking which objects have already been processed. WeakSets are ideal for this purpose:

// 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);

Here, a WeakSet is created on the first run, and passed along with every subsequent function call (using the internal _refs parameter). The number of objects or their traversal order is immaterial, so a WeakSet is more suitable (and performant) than a Set for tracking object references, especially if a very large number of objects is involved.

コンストラクタ

WeakSet()
Creates a new WeakSet object.

プロパティ

WeakSet.length
lengthプロパティの値は0です。
WeakSet.prototype
Setコンストラクタに対するプロトタイプを表します。すべてのWeakSetオブジェクトにプロパティを追加できます。

WeakSet インスタンス

すべてのWeakSet インスタンスはWeakSet.prototypeから継承します。

プロパティ

WeakSet.prototype.constructor
Returns the function that created an instance's prototype. This is the WeakSet function by default.

メソッド

WeakSet.prototype.add(value)
Appends a new object with the given value to the WeakSet object.
WeakSet.prototype.delete(value)
Removes the element associated to the value. WeakSet.prototype.has(value) will return false afterwards.
WeakSet.prototype.has(value)
Returns a boolean asserting whether an element is present with the given value in the WeakSet object or not.
WeakSet.prototype.clear()
Removes all elements from the WeakSet object.

例: 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); // removes foo from the set
ws.has(foo);    // false, foo has been removed
ws.has(bar);    // true, bar is retained

Note that foo !== bar. While they are similar objects, they are not the same object. And so they are both added to the set.

仕様

仕様 ステータス コメント
ECMAScript 2015 (6th Edition, ECMA-262)
WeakSet の定義
標準 初期定義。

ブラウザ実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
WeakSetChrome 完全対応 36Edge 完全対応 12Firefox 完全対応 34IE 未対応 なしOpera 完全対応 23Safari 完全対応 9WebView Android 完全対応 37Chrome Android 完全対応 36Firefox Android 完全対応 34Opera Android 完全対応 24Safari iOS 完全対応 9Samsung Internet Android 完全対応 3.0nodejs 完全対応 0.12
WeakSet() constructorChrome 完全対応 36Edge 完全対応 12Firefox 完全対応 34IE 未対応 なしOpera 完全対応 23Safari 完全対応 9WebView Android 完全対応 37Chrome Android 完全対応 36Firefox Android 完全対応 34Opera Android 完全対応 24Safari iOS 完全対応 9Samsung Internet Android 完全対応 3.0nodejs 完全対応 0.12
addChrome 完全対応 36Edge 完全対応 12Firefox 完全対応 34IE 未対応 なしOpera 完全対応 23Safari 完全対応 9WebView Android 完全対応 37Chrome Android 完全対応 36Firefox Android 完全対応 34Opera Android 完全対応 24Safari iOS 完全対応 9Samsung Internet Android 完全対応 3.0nodejs 完全対応 0.12
clear
非推奨非標準
Chrome 未対応 36 — 43Edge 未対応 なしFirefox 未対応 34 — 46IE 未対応 なしOpera 未対応 25 — 30Safari 未対応 なしWebView Android 未対応 37 — 43Chrome Android 未対応 36 — 43Firefox Android 未対応 34 — 46Opera Android 未対応 25 — 30Safari iOS 未対応 なしSamsung Internet Android 未対応 3.0 — 4.0nodejs 未対応 なし
deleteChrome 完全対応 36Edge 完全対応 12Firefox 完全対応 34IE 未対応 なしOpera 完全対応 23Safari 完全対応 9WebView Android 完全対応 37Chrome Android 完全対応 36Firefox Android 完全対応 34Opera Android 完全対応 24Safari iOS 完全対応 9Samsung Internet Android 完全対応 3.0nodejs 完全対応 0.12
hasChrome 完全対応 36Edge 完全対応 12Firefox 完全対応 34IE 未対応 なしOpera 完全対応 23Safari 完全対応 9WebView Android 完全対応 37Chrome Android 完全対応 36Firefox Android 完全対応 34Opera Android 完全対応 24Safari iOS 完全対応 9Samsung Internet Android 完全対応 3.0nodejs 完全対応 0.12

凡例

完全対応  
完全対応
未対応  
未対応
非標準。ブラウザー間の互換性が低い可能性があります。
非標準。ブラウザー間の互換性が低い可能性があります。
非推奨。新しいウェブサイトでは使用しないでください。
非推奨。新しいウェブサイトでは使用しないでください。

関連情報