LOG

Set + Map + WeakSet + WeakMap

Set

なんでも格納するやつ。格納された値は一意
参考:Set

let set = new Set();
set.add(1).add('hello').add('yokota').add('hello');

set.forEach(()=>{
    console.log(val);
    // -> 1
    // -> hello
    // -> yokoota
    // helloはすでにあるので、最後のhelloは格納されない
})
console.log(set.size);
// -> 3

イテレート可能なオブジェクトを渡すことで一括登録もできる

let arr = [1,2,3]
let set = new Set(arr);
set.forEach((key,val,set)=>{
    console.log(key);
    // -> 1
    // -> 2
    // -> 3
})

Map

Setと違い、キー/値で登録する
オブジェクトでもキーの設定、削除、値を取り出しなどが出来るが以下の点が違う

  • Object はプロトタイプを持つため、既定のキーがマップ中に存在します。しかし、これは map = Object.create(null) を使うことで回避することができます。
  • Object のキーは String ですが、Map では任意の値がキーとなり得ます。
  • Map の大きさは簡単に得ることができます。一方、Object の大きさは手動で記録する必要があります。
  • キーが実行時まで不明なとき、またすべてのキーの型が同じでかつすべての値の型が同じときは、オブジェクトよりマップを使いましょう。

引用&参照:Map – JavaScript | MDN

let map = new Map();
map.set('hoge','huga');
map.set('hoge','piyo');

console.log(map.get('hoge'));
// -> piyo
// 最初のset('hoge','huga')は上書きされる

console.log(map.size);
// -> 1

let val = 'variable';

map.set(val,'hello');
// 変数の値をキーとしているだけなので値を登録する必要がある

console.log(map.get(val));
// -> hello

console.log(map.get('variable'));

// -> hello
// 変数の値をキーにしてるだけなので取れちゃう

let obj = {a:1};
map.set(obj,'myObj');
console.log(map.get(obj));
// -> myObj
console.log(map.get({}));
// -> undefined
console.log(map.get({a:1}));
// -> undefined
let copyObj = obj;
copyObj.a = 2;
console.log(map.get(copyObj));
// -> myObj

WeakSet

コレクションとして弱保持されたobjectsを格納。
Setと違い、オブジェクトのみコレクション出来る。
格納されているオブジェクトへの参照がない場合、GC対象になる。
コレクションの列挙は出来ない。
参照:WeakSet

let ws = new WeakSet();

let obj = { a : 1 }
let arr = [1,2,3]

ws.add(obj);
console.log(ws);
// -> WeakSet {Object {a: 1}}

ws.add(arr);
console.log(ws);
// -> WeakSet {Object {a: 1}, [1, 2, 3]}

ws.add(1);
// -> Error : Uncaught TypeError: Invalid value used in weak set

ws.add('hoge');
// -> Error : Uncaught TypeError: Invalid value used in weak set

WeakMap

WeakSetのMap版
キーへのアクセスは弱参照なので、キーとなるオブジェクトがなくなればコレクションされている値もGC対象になる
キーにはオブジェクトが指定でき、値はなんでもいける
soft fieldとかobject cacheのために仕様化されたそうな。

参考