Map 對象保存鍵值對。任何值(對象或者原始值) 都可以作為一個鍵或一個值。
語法
new Map([iterable])
iterable
Iterable 可以是一個數(shù)組或者其他 iterable 對象,其元素或為鍵值對,
或為兩個元素的數(shù)組。 每個鍵值對都會添加到新的 Map。null 會被當做 undefined。
Objects 和 maps 的比較
Object 和 Map 類似的是,它們都允許你按鍵存取一個值、刪除鍵、檢測一個鍵是否綁定了值。因此(并且也沒有其他內(nèi)建的替代方式了)過去我們一直都把對象當成 Map 使用。不過 Map 和 Object 有一些重要的區(qū)別,在下列情況里 Map 會是更好的選擇:
- 一個對象的鍵只能是
字符串或者Symbols"Symbol()函數(shù)會返回symbol類型的值,該類型具有靜態(tài)屬性和靜態(tài)方法。它的靜態(tài)屬性會暴露幾個內(nèi)建的成員對象;它的靜態(tài)方法會暴露全局的symbol注冊,且類似于內(nèi)建對象類,但作為構(gòu)造函數(shù)來說它并不完整,因為它不支持語法:"new Symbol()"。"),但一個Map的鍵可以是任意值,包括函數(shù)、對象、基本類型。 - 你可以通過
size屬性直接獲取一個Map的鍵值對個數(shù),而Object的鍵值對個數(shù)只能手動計算。 -
Map是可迭代的,而Object的迭代需要先獲取它的鍵數(shù)組然后再進行迭代。 -
Object都有自己的原型,所以原型鏈上的鍵名有可能和對象上的鍵名產(chǎn)生沖突。雖然 ES5 開始可以用map = Object.create(null)來創(chuàng)建一個沒有原型的對象,但是這種用法不太常見。 - Map 在涉及頻繁增刪鍵值對的場景下會有些性能優(yōu)勢。
實際使用
/**
* map() 方法返回一個新數(shù)組,數(shù)組中的元素為原始數(shù)組元素調(diào)用函數(shù)處理后的值。
* map() 方法按照原始數(shù)組元素順序依次處理元素。
* 注意: map() 不會對空數(shù)組進行檢測。
* 注意: map() 不會改變原始數(shù)組。
*/
var m = new Map([[1,"x"],[2,"y"],[3,"z"]]);
//返回Map對象的鍵/值對的數(shù)量。
console.log(m.size)
//map賦值
m.set("key","value")
//判斷是否有值
m.has("bar"); // false
//返回鍵對應的值,如果不存在,則返回undefined。
m.get("key")
//移除任何與鍵相關(guān)聯(lián)的值,并且返回該值,該值在之前會被Map.prototype.has(key)返回為true。
//之后再調(diào)用Map.prototype.has(key)會返回false。
m.delete("key")
//返回一個新的 Iterator對象, 它按插入順序包含了Map對象中每個元素的鍵 。
m.keys();
//清空map中的值
m.clear();
for of 遍歷map
for (var x of m){
//遍歷map
console.log(x);
console.log(x[0]);
// test();
// console.log(area_of_circle(3));
}
//Map的回調(diào)函數(shù)參數(shù)依次為value、key和map本身:
m.forEach(function(value,key,map){
console.log('value='+value+',key='+key+',map='+map)
})