← All notes
LeetCode Cycle 03+04:Map / Set / Hash Table 在面試題裡的取捨
接 Cycle 02 結尾的 Object vs Map——Cycle 03 跟 Cycle 04 合併講,因為 Map / Set 是 ES6 才有的、Hash Table 是底層原理,要一起講才完整。NaN 在 Set 裡只算一個、SameValueZero 是面試陷阱題。內部使用。
Cycle 03 跟 Cycle 04 在 Notion 是分兩篇的:Cycle 03 講 Map / Set,Cycle 04 講 Hash Table。實作上我直接合併——因為 ES6 的 Map 跟 Set 本身就是 hash table 的高層封裝,把 collision 怎麼解、為什麼 size 是 O(1)、為什麼 NaN 在 Set 裡只算一個放在一起講,才不會在面試現場被追問時拆成三層斷掉。
這篇承接 Cycle 02 結尾留下的問題:什麼時候 {}、什麼時候 Map?以下展開。
Map vs Object 的六條差異
從 Cycle 02 已經摸過的兩條(key 型別、size 取得)展開,把面試會問的六條規格差異拉成一張表:
| 差異 | Object | Map |
|---|---|---|
| key 型別 | 只能 string / symbol | 任意值(含 object、function、NaN) |
| 插入順序 | integer-like key 先排,其他依插入序 | 嚴格依插入序[^1] |
| size | Object.keys(o).length,O(n) | map.size,spec 規範 O(1)[^1] |
| 預設 key 撞名 | 有 __proto__、toString 等 | 沒有 |
| 序列化 | 原生 JSON.stringify | 不支援,要手動 [...map] 拆 |
| 比對語義 | === | SameValueZero(NaN 算同一個)[^1] |