[觀念筆記] JavaScript 中 Object 和 Map 的差別是什麼?

更新於 發佈於 閱讀時間約 7 分鐘

Object 是什麼?

  • Object 就是 {}
  • 內容元素會是屬性 (key) 和 值 (value)

範例:

const obj = {
name: "小明",
age: 28
};
  • Object 的 key 只能是字串或 Symbol
  • 如果用數字或物件當 key,JavaScript 會自動把它轉成字串

範例:

const obj = {
1: "one",
true: "yes",
[ {a: 1} ]: "object"
};

console.log(obj);
// 實際上 key 變成:
// {
// "1": "one",
// "true": "yes",
// "[object Object]": "object"
// }


Map 是什麼?

  • Map 也是一種用 key-value pair 儲存資料的資料結構它解決了 Object 的 key 只能是字串或 Symbol 的限制
  • Map 的 key 可以是任何型別:
    • 字串
    • 數字
    • 布林
    • 物件
    • 陣列
    • 函式


Object 與 Map 差異

key 型別限制:

  • Object:只能字串或 Symbol
  • Map:任何型別(含物件、陣列、函式)

順序性:

  • Object:沒有嚴格順序
  • Map:有順序,按照插入順序迭代

可迭代性:

  • Object:不可直接用 for...offorEach 迭代
  • Map:可直接用 for...offorEach 迭代

常用方法:

  • Object:Object.keysObject.values
  • Map:setgethasdeleteclearsize


Object 的元素沒有順序性;Map 的有順序

  • Map 會按照插入的順序記錄 key-value,迭代時順序固定

範例:

const map = new Map();
map.set("b", 2);
map.set("a", 1);
console.log([...map.keys()]); // ["b", "a"]


Map 的常用方法

  • set(key, value):設定 key 對應的 value
  • get(key):取得 key 對應的 value
  • has(key):檢查 Map 是否有某個 key
  • delete(key):刪除某個 key-value
  • clear():清空所有 key-value
  • size:Map 內部的資料筆數

範例:

const map = new Map();
map.set("a", 1);
map.set("b", 2);

console.log(map.get("a")); // 1
console.log(map.has("b")); // true
console.log(map.size); // 2
map.delete("a");
console.log(map.size); // 1
map.clear();
console.log(map.size); // 0


Map 的可迭代性

Map 可以直接用 for...of 迭代

範例:

const map = new Map();
map.set("a", 1);
map.set("b", 2);

for (let [key, value] of map) {
console.log(key, value);
}
// a 1
// b 2

使用 Map 方法的重點觀念 — 物件傳參考

物件是「傳參考」,意思是:

  • 即使定義的兩個物件內容一樣,兩個值都是 { a: 1 } 也會指向不同記憶體位置
  • Map 在使用 set 和 get 的時候,會依照記憶體位置來找值
  • 因此使用 set 和 get 時,若 key 是物件型別,會宣告一個變數來儲存同一個參考 (同一個記憶體位置)
  • 若 get 方法的 key 參數直接用物件型別(如 { }),value 會是 undefined

範例:

const map = new Map();
const objKey = { a: 1 }; // 透過變數賦值物件
map.set(objKey, "hello"); // 再透過變數為 key,設定 value

console.log(map.get({ a: 1 })); // undefined
console.log(map.get(objKey)); // hello
  • 要用同一個變數 (記憶體位址) 才找得到資料
  • 雖然 get 用 { a: 1 } 當 key,值和變數 objKey 一樣,但這樣使用會指向另一個記憶體位置,而非 objKey 指向的記憶體位置,所以結果 undefined

小測驗題 & 解答

const map = new Map();const key1 = [1, 2, 3];map.set(key1, "hello");console.log(map.get([1, 2, 3])); // undefinedconsole.log(map.get(key1));      // "hello"console.log(key1);               // [1, 2, 3]
  • 因為 [1, 2, 3] 跟 key1 是兩個不同記憶體位址因為 Map 有用 set 設定 key 為 key1,其 value 為 "hello",所以後面用 get 方法取 key1 的 value 是 "hello"

總結:

Object:

  • key 限制字串或 Symbol
  • 沒有順序
  • 不支援 for...of 、forEach 迭代方法

Map:

  • key 可以是任何型別
  • 有順序
  • 支援 for...of 、forEach 迭代方法
  • 注意指向的記憶體位址,使用物件/函式作為 key 時要同一個參考


留言
avatar-img
留言分享你的想法!
avatar-img
Go Go Coding
1會員
3內容數
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
這篇內容,將會講解什麼是資料型態,以及與資料型態相關的知識。包括資料型態的簡介、實數、布林值、 字串、陣列。
Thumbnail
這篇內容,將會講解什麼是資料型態,以及與資料型態相關的知識。包括資料型態的簡介、實數、布林值、 字串、陣列。
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
了解這些運算子及其優先等級有助於更好地理解和編寫 JavaScript 代碼
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
在本章節中,我們將學習JavaScript的基本語法,包括如何註解代碼和如何聲明變數。瞭解這些基礎知識對於進一步學習和使用JavaScript來編寫代碼是非常重要的。
Thumbnail
高中數學主題練習—求空間中直線參數式
Thumbnail
高中數學主題練習—求空間中直線參數式
Thumbnail
高中數學主題練習—求空間中平面
Thumbnail
高中數學主題練習—求空間中平面
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News