說明:
Map結構提供了“值—值”的對應,是一種更完善的Hash結構實現。如果你需要“鍵值對”的數據結構,Map比Object更合適。它類似於對象,也是鍵值對的集合,但是“鍵”的范圍不限於字符串,各種類型的值(包括對象)都可以當作鍵。
map 的定義
1、let map = new Map(); 2、let map = new Map([[key,value],[key,value]]); //默認帶初始化參數的定義
如果Map的鍵是一個簡單類型的值(數字、字符串、布爾值),則只要兩個值嚴格相等,Map將其視為一個鍵,包括0和-0。另外,雖然NaN不嚴格相等於自身,但Map將其視為同一個鍵。
let map = new Map(); let obj = {name:1}; map.set(true,'111'); map.set(obj,'111'); map.set(1,1); map.set(1,1); map.set(undefined,undefined); map.set(null,null); map.set(NaN,NaN); map.set([1,2,3],1); console.log(map); // map{[[Entries]]:[ {true => "111"}, {Object => "111"}, {1 => 1}, {undefined => undefined}, {null => null}, {NaN => NaN}, {Array(3) => 1} ]}
注意:只有對同一個對象的引用,Map結構才將其視為同一個鍵。
var map = new Map(); map.set(['a'], 555); map.get(['a']) // undefined
上面代碼的set和get方法,表面是針對同一個鍵,但實際上這是兩個值,內存地址是不一樣的,因此get方法無法讀取該鍵,返回undefined。
實例屬性和方法:
size、set、get、has、delete、clear
遍歷方法:
keys()、values()、entries()、forEach()
Map 和 Array的對比 優勢與劣勢
let map = new Map(); let arr = new Array(); //增: map.set('a',1); arr.push({'a': 1}); //查: map.has('a'); arr.find(item=>item.a); //改: map.set('a',2); arr.forEach(item=>item.a?item.a=2:''); //刪: map.delete('a'); arr.splice(arr.findIndex(item=>item.a),1); console.log(map); console.log(arr);
set map object 對比 優勢與劣勢
let item = {a: 1}; let set = new Set(); let map = new Map(); let obj = new Object(); //增 set.add(item); map.set('a', 1); obj['a'] = 1; //查 set.has(item);// true map.has('a');// true 'a' in obj;// true //改 item.a = 2; map.set('a', 2); obj['a'] = 2; //刪 set.delete(item); map.delete('a'); delete obj['a']; console.log(set); console.log(map); console.log(obj);