map是ES提供的一種字典數據結構。
字典結構——用來存儲不重復key的hash結構。不同於集合(set)的是,字典使用的是鍵值對的形式來存儲數據
JavaScript對象(object:{})只能用字符串來當key,這對使用帶來了不便
為了解決這個問題,ES6提供了map數據結構。其類似於對象,也是鍵值對的集合,但“key”的范圍不僅限於字符串,而是各種類型的值都可以當做key。也就是說,object提供了“字符串-值”的對應結構,map則提供的是“值-值”的對應。是一種更加完善的hash結構
對象對map結構的支持演示
var data1={a:1}, data2={b:2}, obj={}; //為obj對象添加屬性(將data1和data2作為屬性名)
obj[data1]=1; obj[data2]=2; console.log(obj);
可以看到結果並非我們需要的
創建一個map
const map=new Map([ ['a',1], ['b',2] ]); console.log(map);
上面的['a',1]代表,將a作為key,1作為value聲明
那么是否['a',1]中能寫入第三個元素呢?答案是可以的,但是!ES6不會理你
map類的屬性——size 用於獲取map的長度
console.log(map.size);
map類的方法——set Map.set(key,value) 設置鍵名key對應的鍵值為value,然后返回整個map結構。如果key已經有值,則鍵值會被更新,否則生成新的鍵
console.log(map.set([1,2,3],'3元素的數組')); //也可以鏈式添加
map.set('name','張三').set('age',28); console.log(map);
map類的方法——get Map.get(key) 讀取key對應的鍵值,如果獲取不到則返回undefined
console.log(map.get('name'));
獲取數組對應的鍵值——后續補充
map類的方法——delete Map.delete(key) 刪除某個鍵,如果刪除成功返回true,否則返回false
console.log(map.delete('name'));
map類的方法——has Map.has(key) 判斷某個鍵是否存在於map中,返回布爾值
console.log(map.has('age'));
map類的方法——clear Map.clear() 清除所有數據,沒有返回值
map.clear();
map類的方法——keys Map.keys() 返回鍵名的遍歷器
console.log(map.keys());
map類的方法——values Map.values() 返回鍵值的遍歷器
console.log(map.values());
map類的方法——entries Map.entries() 返回鍵值對的遍歷器
console.log(map.entries());
map類的方法——forEach map.forEach(function(){}) 使用回調遍歷每一個成員
map.forEach(function (value, key, map) { console.log(`這是key:${key},這是value:${value},這是map本身:${map}`); })
Map在使用過程中需要注意的地方
1.在js中NaN是不等於自身的一種數據類型,但是在map中,多次set以NaN為key的數據的時候,會產生覆蓋的行為。說明map會將NaN視為同一個鍵
map.set(NaN,1).set(NaN,10); console.log(map);
2.如果map數據中以空對象作為key({})的話,會發現,出現了兩個key,這是因為每一個{}都是全新的引用,其不同的是內存地址。而反觀上面的NaN,其地址只有一個,所以才會出現覆蓋的情況
map.set({},1).set({},2); console.log(map);