JavaScript Map用法詳解

一、Map簡介

Map是JavaScript中ES6新增的一種數據結構,用於存儲鍵值對的集合。與Object類似,但是Map提供了更為靈活與強大的數據結構。

二、Map的基礎用法

1. 創建Map實例

const map = new Map();

2. 添加鍵值對

map.set('name', 'Alice');
map.set('age', 28);

3. 獲取鍵值對

map.get('name'); // 'Alice'

4. 檢查鍵是否存在

map.has('name'); // true

5. 獲取鍵值對數量

map.size; // 2

三、Map的高級用法

1. 可以使用任何類型作為鍵

除了undefined,可以使用任何類型的值作為鍵:

const map2 = new Map();
const key1 = {};
const key2 = {};
map2.set(key1, 'value1');
map2.set(key2, 'value2');
map2.get(key1); // 'value1'

這是Object無法做到的。

2. 鏈式調用

Map的set方法返回Map實例本身,因此可以使用鏈式調用:

map.set('name', 'Bob')
   .set('age', 30);

3. 可以使用迭代器遍歷Map

可以使用for…of語句遍歷Map,或者使用forEach()方法遍歷鍵值對:

for (const [key, value] of map) {
  console.log(key, value);
}
map.forEach((value, key) => {
  console.log(key, value);
});

4. 可以使用數組初始化Map

可以使用數組創建Map對象。數組的每一項應為一個鍵值對的數組:

const arr = [['name', 'Charlie'], ['age', 32]];
const map3 = new Map(arr);

5. 可以使用spread運算符初始化Map

可以使用spread運算符將一個Map轉化為數組,或者將一個數組轉化為Map:

// Map轉化為數組
const map4 = new Map([['name', 'David'], ['age', 22]]);
const arr2 = [...map4];

// 數組轉化為Map
const arr3 = [['name', 'Emma'], ['age', 25]];
const map5 = new Map(arr3);

四、Map的應用場景

由於Map可以使用任何類型作為鍵,因此在處理一些特殊的數據結構且需要設置其他類型的鍵時,Map更加方便。以下是一些Map常見的使用場景:

1. 存儲函數的參數和返回值

const memoize = (fn) => {
  const cache = new Map();
  return (...args) => {
    const key = JSON.stringify(args);
    if (cache.has(key)) {
      console.log('Cache hit!');
      return cache.get(key);
    }
    console.log('Cache miss!');
    const result = fn(...args);
    cache.set(key, result);
    return result;
  }
};

const fibonacci = memoize((n) => {
  if (n < 2) {
    return n;
  }
  return fibonacci(n - 1) + fibonacci(n - 2);
});

fibonacci(10); // 第一次計算,輸出Cache miss!,計算結果為55
fibonacci(10); // 第二次計算,輸出Cache hit!,返回緩存中的結果55

2. 存儲DOM元素的數據

當需要在DOM元素上存儲數據時,使用Map比在元素上設置屬性更安全。因為在某些情況下,屬性的名字可能會被覆蓋,而Map不會出現這個問題。

const map6 = new Map();
const button = document.querySelector('button');
map6.set(button, { count: 0 });

button.addEventListener('click', () => {
  const data = map6.get(button);
  data.count += 1;
  console.log(`Button clicked ${data.count} times!`);
});

3. 存儲非同步操作的狀態

Map可以容易存儲非同步操作的狀態,並且保持鍵值對的順序不變。以下是一個Map存儲Promise對象的例子:

const map7 = new Map();
const p1 = new Promise((resolve) => {
  setTimeout(() => {
    resolve('Promise 1 resolved!');
  }, 1000);
});
const p2 = new Promise((resolve) => {
  setTimeout(() => {
    resolve('Promise 2 resolved!');
  }, 2000);
});

map7.set(p1, 1);
map7.set(p2, 2);

Promise.all([p1, p2]).then((values) => {
  values.forEach((value) => {
    console.log(map7.get(value));
  });
});

// 輸出為
// 1
// 2

五、總結

通過本篇文章,我們介紹了JavaScript中Map的基礎用法和高級用法,學習了Map與Object的區別和應用場景。在日常的開發中,我們可以根據具體情況選擇使用Map或者Object,以提高代碼的效率和可讀性。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/278990.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-20 15:02
下一篇 2024-12-20 15:02

相關推薦

  • 使用JavaScript日期函數掌握時間

    在本文中,我們將深入探討JavaScript日期函數,並且從多個視角介紹其應用方法和重要性。 一、日期的基本表示與獲取 在JavaScript中,使用Date對象來表示日期和時間,…

    編程 2025-04-28
  • JavaScript中使用new Date轉換為YYYYMMDD格式

    在JavaScript中,我們通常會使用Date對象來表示日期和時間。當我們需要在網站上顯示日期時,很多情況下需要將Date對象轉換成YYYYMMDD格式的字元串。下面我們來詳細了…

    編程 2025-04-27
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • JavaScript中修改style屬性的方法和技巧

    一、基本概念和方法 style屬性是JavaScript中一個非常重要的屬性,它可以用來控制HTML元素的樣式,包括顏色、大小、字體等等。這裡介紹一些常用的方法: 1、通過Java…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和演算法 C語言貪吃蛇主要運用了以下數據結構和演算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25

發表回復

登錄後才能評論