18

この説明を読んだ後:http://wiki.ecmascript.org/doku.php?id=harmony:weak_mapsECMAScript 6 WeakMapsとは何ですか?

私はそれを取得しようとしていますが、私は全体的な画像を取得していません。それはどういうことですか? Firefox 6でサポートされているようだ:http://kangax.github.com/es5-compat-table/non-standard/

+0

こちらの回答はすべて間違っています。弱いマップの唯一の弱点はキーです。つまり、通常の 'Map'とは違って弱いマップにキー値がある場合、それがガベージコレクションされるのを防ぎません。これは、ガベージコレクションを邪魔することなく外部からオブジェクトを拡張する場合に便利です。特に、Raynosの答えは、Mapが何であるかを説明するだけです。 –

+2

関連:[ES6 WeakMapの実際の用途は何ですか?](0120-18753) –

+0

**警告:ここでの回答は両方とも間違っています**。意味のある回答については、上記のコメントのリンク先を参照してください。 –

答えて

11

WeakMap

WeakMapsは基本的にあなたが文字列ではないキーを持つハッシュテーブルを持つことができます。

だから、MDNからMap.get([1])

例を言うことができ、その後、すなわち[1]するキーを設定し、することができます

var wm1 = new WeakMap(), 
    wm2 = new WeakMap(); 
var o1 = {}, 
    o2 = function(){}, 
    o3 = window; 

wm1.set(o1, 37); 
wm1.set(o2, "azerty"); 
wm2.set(o1, o2); // a value can be anything, including an object or a function 
wm2.set(o3, undefined); 
wm2.set(wm1, wm2); // keys and values can be any objects. Even WeakMaps! 

wm1.get(o2); // "azerty" 
wm2.get(o2); // undefined, because there is no value for o2 on wm2 
wm2.get(o3); // undefined, because that is the set value 

wm1.has(o2); // true 
wm2.has(o2); // false 
wm2.has(o3); // true (even if the value itself is 'undefined') 

wm1.has(o1); // true 
wm1.delete(o1); 
wm1.has(o1); // false 

そのexistance理由は次のとおりです。

弱いキーテーブルの多くの用途に存在するメモリリークを修正するためには、

が必要です。

明らかに弱いマップをエミュレートすると、メモリリークが発生します。私はそれらのメモリリークの詳細を知らない。

+5

メモリリークの理由は、それを自分で実装するために、キーを配列に格納する必要があります。つまり、他のすべての参照がなくなってもガベージコレクションされません。したがって、対応する値にアクセスする方法はありませんとにかく –

+1

私はあなたが2015の観点からこの答えを修正できると思います:) –

15

弱参照は、オブジェクトポインタを含む特殊オブジェクトですが、そのオブジェクトを有効にしません。

弱参照の1つの応用は、弱マップで実装されています:

「経験のJavaScriptプログラマは、このAPIは、によって共有される2つの配列(キーの1、値のための1)とJavaScriptで実装することができることに気づくでしょう4つのAPIメソッドそのような実装には2つの主要な不都合があります。最初のものはO(n)検索です(nはマップ内のキーの数です)。 2番目はメモリリークの問題です。手動で作成されたマップでは、キーの配列はキーオブジェクトへの参照を保持し、ガベージコレクションされないようにします。ネイティブウィークマップでは、キーオブジェクトへの参照が「弱く」保持されているため、オブジェクトへの参照がない場合にガベージコレクションが行われることはありません。 Firefoxで最初にリリースされました...)

0

WeakMapでは、オブジェクトをキーとして使用できます。 マップの長さを知る方法はありません。長さは、キーがキーとしてオブジェクトを使用する方法について注意の言葉は、すべてのオブジェクトがデフォルトのシングルトンでJavaScriptで、我々はオブジェクト参照を作成し、それを使用する必要がありますされているので、あるプリミティブ値

することはできません常に1 です。

これは、匿名オブジェクトを作成するときに異なるためです。

if ({} !== {}) { console.log('Objects are singletons') }; 
// will print "Objects are singletons" 

だから、次のシナリオでは、我々は値

var wm = new WeakMap() 
wm.set([1],'testVal'); 
wm.get([1]); // will be undefined 

そして、次のスニペットを得ることを期待することはできません期待どおりに動作します。

var a = [1]; 
wm.set(a, 'testVal'); 
wm.get(a); // will return 'testVal' 
関連する問題