起因 為了降低併發時的API請求量, 這兩天寫了個LRU Cache. 其中用到了Set做AllowList, 來判斷API是否應該被緩存. 在MDN查API時, 發現Set被歸類在Keyed Collection中. 一直以來, 下意識覺得Set只是value唯一的Array. 應該屬於Index ...
起因
為了降低併發時的API請求量, 這兩天寫了個LRU Cache. 其中用到了Set做AllowList, 來判斷API是否應該被緩存.
在MDN查API時, 發現Set被歸類在Keyed Collection中. 一直以來, 下意識覺得Set只是value唯一的Array. 應該屬於Indexed Collection. 感覺有些奇怪, 所以就查了下Set的實現機制
過程
一開始, 先去MDN查的文檔, 只說了屬於Keyed Collection, 但沒細說為什麼. 又去ecma-international.org, 查ECMA標準, 結果也沒有明確說明, 為什麼Set屬於Keyed Collection. 我一開始還覺得是文檔寫得不夠詳細, 後來發現是自己太菜了
簡單思考了下, 沒想通. 就使用魔法武器了. 雖然有點前後不一, 但copilot提供了最關鍵的信息: Hash Table. 下邊是copilot的回答
在 JavaScript 中,Set 是一種基於哈希表實現的數據結構,用於存儲一組唯一的值。Set 屬於 ECMAScript 6 中新增的數據類型之一,被歸類為 Keyed Collection 類型。
Keyed Collection 是 ECMAScript 6 中新增的一種數據類型,用於存儲一組鍵值對。除了 Set 之外,還包括 Map 和 WeakMap。這些數據類型都具有以下特點:
- 可以使用任意類型的值作為鍵。
- 可以使用 for...of 迴圈遍歷鍵值對。
- 可以使用 size 屬性獲取鍵值對的數量。
Set 作為 Keyed Collection 的一種,可以使用任意類型的值作為元素,而且每個元素都是唯一的。因此,Set 可以用於實現集合、過濾重覆值等功能。
需要註意的是,Set 和 Map 的實現方式不同,雖然它們都屬於 Keyed Collection 類型。Map 是一種鍵值對的集合,其中每個鍵都是唯一的,可以使用鍵來訪問對應的值。Set 是一種值的集合,其中每個值都是唯一的,可以使用值來訪問對應的值。
再然後, 就破案了... 因為Hash Table中, 每個元素都有唯一的key, 用key來訪問對應的值. 所以, Set相當於一個key-value相同的、特殊的Hash Table, 我認為也可以理解為, 一種key-value一致、特殊的Map
結論
- Set是基於Hash Table實現的「值的集合」
- 由於Hash Table的key-value特性, Set的key-value相同
- Set相當於一種特殊的Map
所以, Set屬於Keyed Collection
┌─────┐
┌─▶│Array│
┌──────────────────┐ │ └─────┘
┌─▶│Indexed Collection│──┤
│ └──────────────────┘ │ ┌───────────┐
│ └─▶│Typed Array│
│ └───────────┘
┌────────────┐ │
│ Collection │──┤ ┌───┐ *
└────────────┘ │ ┌─▶│Map│ *
│ │ └───┘ *
│ │ ┌───────┐ *
│ ┌──────────────────┐ ├─▶│WeakMap│ * ┌───────────────────┐
└─▶│ Keyed Collection │──┤ └───────┘ * │Based on Hash Table│
└──────────────────┘ │ ┌───┐ * └───────────────────┘
├─▶│Set│ *
│ └───┘ *
│ ┌───────┐ *
└─▶│WeakSet│ *
└───────┘ *
資料
- https://262.ecma-international.org/13.0/#sec-keyed-collections
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Keyed_collections#key_and_value_equality_of_map_and_set
本文來自博客園,作者:林十二XII
轉載請註明原文鏈接:https://www.cnblogs.com/lin-xii/p/js-zhong-set-wei-shen-me-shi-dai-jian-de-ji-he.html