WeakMap【弱参照マップ】オブジェクトの基本操作
・new WeakMap【コンストラクタ】
・delete【要素削除】
・get【要素値取得】
・has【要素有無】
・set【要素追加・更新】

メモ

概要

  • WeakMap弱参照マップ】オブジェクトの基本操作
    • 要素数の取得・要素列挙方法はなし

関連

外部リンク

構文

操作構文戻り値例外備考
コンストラクタnew WeakMap( [ iterable ] ) WeakMap【弱参照マップ】オブジェクトTypeError 例外
要素削除delete( key ) true:要素削除
false:要素なし
要素値取得get( key ) 要素の値:要素あり
undefined:要素なし
要素有無has( key ) true:要素あり
false:要素なし
要素追加・更新 set( key, value ) WeakMap【弱参照マップ】オブジェクトTypeError 例外既存要素:更新

  • iterable:キーと値から成るイテレータオブジェクト 及び それに準ずるもの (キーと値の配列から成る2次元配列等)
  • key:要素のキー
  • value:要素の値

TypeError 例外 new WeakMap【コンストラクタ】 new なし (関数として呼び出し)
入力のiterableが不正
set【要素追加・更新】入力のkeyがオブジェクト以外

const weakMap = new WeakMap();
const obj1 = new Object("obj1");
let obj2 = new Object("obj2");
const obj3 = new Object("obj3");
weakMap.set(obj1, "OBJ1");
weakMap.set(obj2, "OBJ2");
weakMap.set(obj3, "OBJ3");
weakMap.set(obj3, "OBJ3-new");   // 更新
const symbol1 = Symbol('Symbol (1)');
weakMap.set(symbol1, 'VALUE 1');
let symbol2 = Symbol('Symbol (2)');
weakMap.set(symbol2, 'VALUE 2');
const symbol3 = Symbol('Symbol (3)');
weakMap.set(symbol3, 'VALUE 3');

console.log( weakMap.get(obj1) );  // 出力:OBJ1
console.log( weakMap.get(obj2) );  // 出力:OBJ2
console.log( weakMap.get(obj3) );  // 出力:OBJ3-new
console.log( weakMap.get(symbol1) );  // 出力:VALUE 1
console.log( weakMap.get(symbol2) );  // 出力:VALUE 2
console.log( weakMap.get(symbol3) );  // 出力:VALUE 3
console.log( weakMap.has(obj1) );  // 出力:true
console.log( weakMap.has(obj2) );  // 出力:true
console.log( weakMap.has(obj3) );  // 出力:true
console.log( weakMap.has(symbol1) );  // 出力:true
console.log( weakMap.has(symbol2) );  // 出力:true
console.log( weakMap.has(symbol3) );  // 出力:true

obj2 = new Object("obj2");         // 別のオブジェクト
weakMap.delete(obj3);              // 削除
symbol2 = Symbol('Symbol (2) New');// 別のシンボル
weakMap.delete(symbol3);           // 削除
console.log( weakMap.get(obj1) );  // 出力:OBJ1
console.log( weakMap.get(obj2) );  // 出力:undefined (元のオブジェクトなし)
console.log( weakMap.get(obj3) );  // 出力:undefined (削除済)
console.log( weakMap.get(symbol1) );  // 出力:VALUE 1
console.log( weakMap.get(symbol2) );  // 出力:undefined (元のシンボルなし)
console.log( weakMap.get(symbol3) );  // 出力:undefined (削除済)
console.log( weakMap.has(obj1) );  // 出力:true
console.log( weakMap.has(obj2) );  // 出力:false (元のオブジェクトなし)
console.log( weakMap.has(obj3) );  // 出力:false (削除済)
console.log( weakMap.has(symbol1) );  // 出力:true
console.log( weakMap.has(symbol2) );  // 出力:false (元のシンボルなし)
console.log( weakMap.has(symbol3) );  // 出力:false (削除済)
const objA = new Object("objA");
const objB = new Object("objB");
const objC = new Object("objC");
const mySymbol = Symbol('My Symbol');
const array = [ [objA, 1], [objB, 3], [objC, 5], [mySymbol, 7] ];
const weakMap2 = new WeakMap(array);
console.log( weakMap2.get(objA) );  // 出力:1
console.log( weakMap2.get(objB) );  // 出力:3
console.log( weakMap2.get(objC) );  // 出力:5
console.log( weakMap2.get(mySymbol) );  // 出力:7
try {
  const weakMapNg1 = WeakMap();  // TypeError 例外 (new なし)
} catch(e) {
  console.log(e);  // 例外:TypeError: Constructor WeakMap requires 'new'
}

try {
  const weakMapNg2 = new WeakMap(123);// TypeError 例外 (入力のイテレータオブジェクトが不正)
} catch(e) {
  console.log(e);  // 例外:TypeError: number 123 is not iterable (cannot read property Symbol(Symbol.iterator))
}

try {
  const weakMap3 = new WeakMap();
  weakMap3.set(123, "123");  // TypeError 例外 (キーがオブジェクト・シンボル以外)
} catch(e) {
  console.log(e);  // 例外:ReferenceError: weakMap3 is not defined
}