Map, Set, WeakMap and WeakSet
現在已知有 object 儲存 key 的資料,array 儲存 index 的資料,但這對現實世界來說還不夠。
Map
map 跟 object 一樣,唯一不同的是 key 可以是任何類型的值。map 的方法如下:
new Map()– creates the map.map.set(key, value)– stores the value by the key.map.get(key)– returns the value by the key,undefinedifkeydoesn’t exist in map.map.has(key)– returnstrueif thekeyexists,falseotherwise.map.delete(key)– removes the value by the key.map.clear()– clears the mapmap.size– returns the current element count.
let map = new Map();
map.set('1', 'str1'); // a string key
map.set(1, 'num1'); // a numeric key
map.set(true, 'bool1'); // a boolean key
// remember the regular Object? it would convert keys to string
// Map keeps the type, so these two are different:
alert( map.get(1) ); // 'num1'
alert( map.get('1') ); // 'str1'
alert( map.size ); // 3
// object key
let john = { name: "John" };
// for every user, let's store their visits count
let visitsCountMap = new Map();
// john is the key for the map
visitsCountMap.set(john, 123);
alert( visitsCountMap.get(john) ); // 123
// object with object key
let john = { name: "John" };
let visitsCountObj = {}; // try to use an object
visitsCountObj[john] = 123; // try to use john object as the key
// That's what got written!
alert( visitsCountObj["[object Object]"] ); // 123
// before map exist
// we add the id field
let john = { name: "John", id: 1 };
let visitsCounts = {};
// now store the value by id
visitsCounts[john.id] = 123;
alert( visitsCounts[john.id] ); // 123
// chain
map.set('1', 'str1')
.set(1, 'num1')
.set(true, 'bool1');Map from Object
Iteration over Map
map.keys()– returns an iterable for keys,map.values()– returns an iterable for values,map.entries()– returns an iterable for entries[key, value], it’s used by default infor..of.
Set
set 是一個值的集合,裡面的值不能重複。替代方案是插入值時用 arr.find() 檢查是否有該值,但會造成性能變差。
new Set(iterable)– creates the set, and if aniterableobject is provided (usually an array), copies values from it into the set.set.add(value)– adds a value, returns the set itself.set.delete(value)– removes the value, returnstrueifvalueexisted at the moment of the call, otherwisefalse.set.has(value)– returnstrueif the value exists in the set, otherwisefalse.set.clear()– removes everything from the set.set.size– is the elements count.
Iteration over Set
set.keys()– returns an iterable object for values,set.values()– same asset.keys, for compatibility withMap,set.entries()– returns an iterable object for entries[value, value], exists for compatibility withMap.
WeakMap and WeakSet
WeakMap / WeakSet 不會阻止 JavaScript 清除 key 的記憶體。換句話說當 key 不存在,存在同個屬性的資料也會不見,使用在當物件存在的時候才需要的資料,物件消失資料也消失。
weakMap 只有以下方法:
weakMap.get(key)weakMap.set(key, value)weakMap.delete(key)weakMap.has(key)
weakSet
It is analogous to
Set, but we may only add objects toWeakSet(not primitives).An object exists in the set while it is reachable from somewhere else.
Like
Set, it supportsadd,hasanddelete, but notsize,keys()and no iterations.
Last updated
Was this helpful?