JavaScript 中的 Map使用指南
JavaScript 中的 Map 完全指南
引言
在 JavaScript 中,Map 是一種用于存儲鍵值對的數(shù)據(jù)結構,具有靈活的鍵類型和豐富的方法。相較于傳統(tǒng)的對象(Object),Map 提供了更高效的鍵值對操作方式,特別適合處理大量數(shù)據(jù)和需要頻繁操作鍵值對的場景。本文將詳細介紹 Map 的創(chuàng)建、常用方法、迭代方式,并探討它與對象的區(qū)別和實際應用場景。
1. 創(chuàng)建 Map
使用 new Map() 來創(chuàng)建一個空的 Map。
const map = new Map();
也可以在創(chuàng)建時初始化 Map,傳入一個包含鍵值對的數(shù)組:
const map = new Map([
["name", "Alice"],
["age", 25]
]);
console.log(map); // 輸出 Map(2) { 'name' => 'Alice', 'age' => 25 }2. Map 和對象的對比
在學習 Map 的基本操作之前,我們先來看一下 Map 與傳統(tǒng)對象的區(qū)別。
| 特性 | Map | 對象 |
|---|---|---|
| 鍵的類型 | 任何類型(字符串、對象、函數(shù)等) | 只能是字符串或符號 |
| 插入順序 | 保持插入順序 | 不保證插入順序 |
| 鍵值對數(shù)量 | size 屬性 | 手動計算(Object.keys().length) |
| 原型鏈污染 | 無 | 有,繼承 Object.prototype |
| 適用場景 | 頻繁操作鍵值對,大量數(shù)據(jù) | 小規(guī)模鍵值對或需要方法時 |
通過對比可以看出,Map 在鍵的類型、插入順序的保持以及鍵值對操作的效率上,都有顯著的優(yōu)勢。
3. Map 的常用方法
3.1 set(key, value)
用于向 Map 添加一個鍵值對。如果鍵已經(jīng)存在,set 會更新其值。
map.set("name", "Bob");
map.set("age", 30);
console.log(map); // 輸出 Map(2) { 'name' => 'Bob', 'age' => 30 }3.2 get(key)
獲取指定鍵的值,如果鍵不存在,返回 undefined。
console.log(map.get("name")); // 輸出 'Bob'
console.log(map.get("gender")); // 輸出 undefined3.3 has(key)
檢查 Map 中是否存在指定的鍵,返回 true 或 false。
console.log(map.has("name")); // 輸出 true
console.log(map.has("gender")); // 輸出 false3.4 delete(key)
刪除指定的鍵值對,返回 true 如果成功刪除,否則返回 false。
map.delete("age");
console.log(map); // 輸出 Map(1) { 'name' => 'Bob' }3.5 clear()
清空 Map,刪除所有鍵值對。
map.clear();
console.log(map); // 輸出 Map(0) {}3.6 size
返回 Map 中鍵值對的數(shù)量。
map.set("name", "Alice");
map.set("age", 25);
console.log(map.size); // 輸出 24. Map 的迭代方法
Map 支持多種迭代方法,可以輕松遍歷其中的鍵值對。
4.1 forEach(callback)
遍歷 Map 中的每一個鍵值對,callback 函數(shù)接受三個參數(shù):值、鍵、Map 本身。
map.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// 輸出:
// name: Alice
// age: 254.2 keys()
返回 Map 中所有鍵的迭代器(Iterator),可以用 for...of 來遍歷。
for (let key of map.keys()) {
console.log(key);
}
// 輸出:
// name
// age4.3 values()
返回 Map 中所有值的迭代器(Iterator)。
for (let value of map.values()) {
console.log(value);
}
// 輸出:
// Alice
// 254.4 entries()
返回 Map 中所有鍵值對的迭代器,每個鍵值對會以 [key, value] 的形式返回。
for (let entry of map.entries()) {
console.log(entry);
}
// 輸出:
// [ 'name', 'Alice' ]
// [ 'age', 25 ]4.5 使用 for...of 遍歷 Map
可以直接用 for...of 遍歷 Map,默認會調(diào)用 entries() 方法,因此會返回 [key, value] 的數(shù)組。
for (let [key, value] of map) {
console.log(`${key}: ${value}`);
}
// 輸出:
// name: Alice
// age: 255. Map 的應用場景
Map 是一種適合存儲鍵值對的結構,尤其適用于以下場景:
需要使用非字符串類型的鍵:對象的鍵只能是字符串或符號,而 Map 可以使用任意數(shù)據(jù)類型作為鍵,比如對象、函數(shù)等。
const objKey = { id: 1 };
const map = new Map();
map.set(objKey, "Object as key");
console.log(map.get(objKey)); // 輸出 'Object as key'- 需要頻繁操作鍵值對:
Map在鍵值對的查找、插入、刪除操作上比對象性能更好,適合在頻繁操作鍵值對的場景下使用。 - 需要保持插入順序:
Map會按照插入的順序存儲鍵值對,因此在遍歷時順序是固定的,而對象則不保證插入順序。 - 避免原型鏈污染:對象的鍵可能會受
Object.prototype影響,而Map沒有原型鏈污染問題,可以安全地存儲任意鍵。
6. 使用 Map 統(tǒng)計字母出現(xiàn)的次數(shù)
我們可以通過一個例子來比較使用 Map 和不使用 Map 的差別。假設我們有一個字符串,需要統(tǒng)計其中每個字母出現(xiàn)的次數(shù)。Map 非常適合這種鍵值對存儲的場景。
方法 1:不用 Map,使用普通對象
function countLettersWithObject(str) {
const letterCounts = {}; // 用對象存儲字母出現(xiàn)的次數(shù)
for (let letter of str) {
if (letterCounts[letter]) {
letterCounts[letter]++;
} else {
letterCounts[letter] = 1;
}
}
return letterCounts;
}
const result = countLettersWithObject("hello world");
console.log(result); // 輸出: { h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }方法 2:使用 Map
function countLettersWithMap(str) {
const letterCounts = new Map(); // 用 Map 存儲字母出現(xiàn)的次數(shù)
for (let letter of str) {
if (letterCounts.has(letter)) {
letterCounts.set(letter, letterCounts.get(letter) + 1);
} else {
letterCounts.set(letter, 1);
}
}
return letterCounts;
}
const resultMap = countLettersWithMap("hello world");
console.log(resultMap); // 輸出: Map(7) { 'h' => 1, 'e' => 1, 'l' => 3, 'o' => 2, 'w' => 1, 'r' => 1, 'd' => 1 }7. WeakMap 簡介
WeakMap 是 Map 的一種特殊類型,它的鍵必須是對象,且是弱引用(即不會阻止對象被垃圾回收)。如果某個對象在其他地方不再被引用,那么即使它是 WeakMap 的鍵,也會被垃圾回收,這樣可以防止內(nèi)存泄漏。
WeakMap的特點 只接受對象作為鍵,不支持基本類型。- 鍵是弱引用,不會阻止垃圾回收。
- 沒有
size屬性、clear方法和遍歷方法(forEach、keys、values、entries),因此不能遍歷WeakMap。
使用場景
WeakMap 通常用于私有屬性或私有數(shù)據(jù)的存儲,不希望這些數(shù)據(jù)影響垃圾回收。它適用于對象間的臨時映射關系,且在數(shù)據(jù)無需遍歷的情況下使用。
const weakMap = new WeakMap();
let obj = { id: 1 };
weakMap.set(obj, "some value");
console.log(weakMap.get(obj)); // 輸出 'some value'
obj = null; // 刪除對象的其他引用
// 在此之后,obj 被垃圾回收,WeakMap 中的鍵值對也會被清除總結
Map 是一種強大的鍵值對數(shù)據(jù)結構,具有靈活的鍵類型支持、保持插入順序、豐富的內(nèi)置方法等優(yōu)勢,適合存儲和操作大量鍵值對。而 WeakMap 則是一種針對對象鍵的弱引用 Map,在特定場景中幫助管理內(nèi)存。希望這些內(nèi)容能幫助你全面理解和應用 Map!
到此這篇關于JavaScript 中的 Map使用指南的文章就介紹到這了,更多相關js map使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaScript toUpperCase()方法使用詳解
這篇文章主要為大家詳細介紹了JavaScript toUpperCase()方法的使用技巧,感興趣的小伙伴們可以參考一下2016-08-08
用JS操作FRAME中的IFRAME及其內(nèi)容的實現(xiàn)代碼
一直都需要這樣的東西,發(fā)現(xiàn)了這個好東西,一定要研究下2008-07-07
微信小程序實現(xiàn)action-sheet彈出底部菜單功能【附源碼下載】
這篇文章主要介紹了微信小程序實現(xiàn)action-sheet彈出底部菜單功能,結合實例形式分析了action-sheet組件彈出菜單的使用技巧,包括元素遍歷、事件響應及屬性設置等操作方法,并附帶源碼供讀者下載參考,需要的朋友可以參考下2017-12-12

