セット、WeakSet、Map、WeakMap

1889 ワード

ES 6は、新しいデータ構造Setを提供する.配列に似ていますが、メンバーの値は全部唯一で、重複した値はありません.Set自体はSetデータ構造を生成するためのコンストラクターである.Setの一般的な方法:elem.add(追加)、elem.delete(削除)、elem.clear(クリア)、elem.has(true/false)
var set = new Set();
[1,2,3,4,6,2,3,8,1].map(function(elem){
    set.add(elem);
});

for(var i of set){
  console.log(i);  //1,2,3,4,6,8
}
//          
[...new Set(array)]
Array.from set                  
function dedupe(array) { 
    return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]
WeakSet WeakSet構造はSetと同様であり、重複しない値のセットでもある.しかし、Setとは2つの違いがあります.まず、WeakSetのメンバーは対象でしかなく、他のタイプの値ではない.次に、WeakSetの対象は弱い参照である.つまり、ゴミ回収メカニズムはWeakSetの対象に対する参照を考慮しない.つまり、他の対象がその対象を引用しない場合、ゴミ回収メカニズムは自動的に対象が占有しているメモリを回収し、対象がまだWeakSetに存在することを考慮しない.この特徴は、WeakSetのメンバーを引用することができないことを意味しますので、WeakSetは遍歴できません.
構築関数として、WeakSetはパラメータとして1つの配列または同様の配列のオブジェクトを受け入れることができる.(実際には、任意のiterableインターフェースを有するオブジェクトは、WeakSetのパラメータとして使用することができる.)この配列のすべてのメンバは、自動的にWeakSetのインスタンスオブジェクトのメンバとなる.
var a = [[1,2], [3,4]];
var ws = new WeakSet(a);
上のコードの中で、aは1つの配列で、2つのメンバーがいて、同じく配列です.aをWeakSetコンストラクタのパラメータとし、aのメンバーは自動的にWeakSetのメンバーになります.
なお、a配列のメンバーは、a配列自体ではなくWeakSetのメンバーとなる.これは、配列のメンバーはオブジェクトだけであることを意味する.
var b = [3, 4];
var ws = new WeakSet(b);// Uncaught TypeError: Invalid value used in weak set(…)
上のコードでは、配列bのメンバーは対象ではなく、WeaKSetを入れるとエラーが発生します.
WeakSetはsize属性がないので、メンバーを遍歴することができません.
var ws = new WeakSet();
ws.size // undefined
ws.forEach // undefined
ws.forEach(function(item){
     console.log('WeakSet has ' + item)})// TypeError: undefined is not a function
上のコードはsizeとforEach属性を取得しようとしましたが、結果は成功しませんでした.
WeakSetが遍歴できないのは、メンバーが弱いからです.いつでも消えるかもしれません.システムを通してメンバーの存在を保証できません.WeakSetの1つの用途は、ドキュメントからこれらのノードが取り外されることを心配することなく、DOMノードを格納することであり、メモリ漏れを引き起こす.詳しくは阮一峰setを参照してください.