WeakMap【弱参照マップ】オブジェクトの基本操作
・new WeakMap【コンストラクタ】
・delete【要素削除】
・get【要素値取得】
・has【要素有無】
・set【要素追加・更新】
メモ
概要
- WeakMap【弱参照マップ】オブジェクトの基本操作
- 要素数の取得・要素列挙方法はなし
関連
外部リンク
- ECMA-262 (英語)
WeakMap ( [ iterable ] ) ES2024 (15) ES2023 (14) ES2022 (13) WeakMap.prototype.delete ( key ) ES2024 (15) ES2023 (14) ES2022 (13) WeakMap.prototype.get ( key ) ES2024 (15) ES2023 (14) ES2022 (13) WeakMap.prototype.has ( key ) ES2024 (15) ES2023 (14) ES2022 (13) WeakMap.prototype.set ( key, value ) ES2024 (15) ES2023 (14) ES2022 (13)
構文
操作 | 構文 | 戻り値 | 例外 | 備考 |
---|---|---|---|---|
コンストラクタ | 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
}