1. ホーム
  2. javascript

[解決済み] ES6 MapとWeakMapの違いは何ですか?

2022-12-16 12:25:43

質問

見る この この MDN ページを見ると、Maps と WeakMaps の唯一の違いは、WeakMaps の "size" プロパティがないことのように見えます。しかし、これは本当でしょうか?両者の違いは何なのでしょうか?

どのように解決するのですか?

から をクリックすると、同じページ、セクション " が表示されます。 なぜ 弱い 地図は? "です。 :

経験豊富なJavaScriptプログラマは、このAPIがJavaScriptで2つの配列(1つはキー、もう1つは識別子)を使って実装できることに気づくでしょう。 はJavaScriptで2つの配列(1つはキー、もう1つは値)で実装できることに気づくでしょう。 の2つの配列で実装できることに気づきます。このような実装には 2つの大きな不都合がある。第一は、O(n)探索である(nはマップのキーの数である)。 nはマップのキーの数)。もうひとつは、メモリリークの問題である。 手動で書かれたマップでは の配列はキーオブジェクトへの参照を保持します。 キーオブジェクトへの参照を保持し、ガベージコレクトされるのを防いでいました。ネイティブの WeakMap では、キーオブジェクトへの参照は "weakly"です。 であり、これは つまり、そのオブジェクトへの他の参照がない場合、ガベージコレクションを妨げないということです。 これは、そのオブジェクトへの他の参照がない場合、ガベージコレクションを防止しないことを意味します。

参照が弱いため、WeakMap のキーは列挙可能ではありません。 (すなわち、キーのリストを与えるメソッドはありません)。もしそうであれば ガベージコレクションの状態に依存することになり、非決定性が発生します。 非決定性をもたらします。

[そして、そのために size プロパティもない] 。

キーのリストを持ちたいのであれば、自分で 自分でメンテナンスしてください。また ECMAScript の提案 弱参照を使用せず、列挙可能な単純なセットとマップの導入を目指した の提案もあります。 を使用せず、列挙可能な単純なセットとマップの導入を目指しています。

- というのは "ノーマル" Map s . MDNでは言及されていませんが 調和提案 には、それらにも items , keysvalues ジェネレータメソッドを実装し Iterator インターフェース .