https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map
————————————————
1.Map對象在遍歷時的順序是確定的,由插入順序決定。用 for ... of 遍歷,不能通過 for in 遍歷。
2.可以通過size屬性,獲取鍵值對的個數(shù),而不是length。
3.Map的基礎(chǔ)用法
let myMap = new Map();
myMap.set('a',1)
myMap.set('b',2)
myMap.get('a')
for (let [key, value] of myMap) {
console.log(key + " = " + value);
}
for (let key of myMap.keys()) {
console.log(key);
}
for (let value of myMap.values()) {
console.log(value);
}
for (let [key, value] of myMap.entries()) { // 只能通過數(shù)組來解構(gòu)
console.log(key + " = " + value);
}
myMap.forEach(function(value, key) { // value 在前,key 在后
console.log(key + " = " + value);
})
myMap.delete('a')
4.Map與數(shù)組
(1)直接用二維數(shù)組生成Map對象
內(nèi)部數(shù)組里只取前兩個值,多的直接丟棄,一個值時value值為undefined,空數(shù)組 key\value 均為undefined
(2)可以用Array.from 將Map對象轉(zhuǎn)成二維數(shù)組,或者直接用展開運算符 ... 。
(3)Map 的復(fù)制和合并
let first = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
let second = new Map([
[1, 'uno'],
[2, 'dos']
]);
let merged = new Map([...first, ...second]); //如果有重復(fù)的鍵值,則后面的會覆蓋前面的
let original = new Map([
[1, 'one']
]);
let clone = new Map(original); //直接用Map對象做參數(shù)
5.可以在Map上設(shè)置對象的屬性,但是有些操作會引起混亂,最好別混用
let wrongMap = new Map()
wrongMap['bla'] = 'blaa'
wrongMap['bla2'] = 'blaaa2'
console.log(wrongMap) // Map { bla: 'blaa', bla2: 'blaaa2' }
wrongMap.has('bla') // false
wrongMap.delete('bla') // false
console.log(wrongMap) // Map { bla: 'blaa', bla2: 'blaaa2' }
6.Map 和Object的比較
| Map | Object | |
|---|---|---|
| 意外的鍵 | 只有顯式插入的鍵 | 有原型,原型上可能有沖突的 |
| 鍵的類型 | 任意值,函數(shù)、對象、數(shù)字等等 | 只能是String和Symbol |
| 鍵的順序 | 有序,以插入順序為準(zhǔn) | 無序,每次遍歷順序可能都不同 |
| size | size屬性 | 只能手動計算鍵值對個數(shù) |
| 迭代 | 是iterable的,可直接迭代 | 以某種方式獲取鍵后才能迭代?? |
| 性能 | 在頻繁增刪鍵值對的場景下表現(xiàn)更好。 | 在頻繁添加和刪除鍵值對的場景下未作出優(yōu)化。 |