起因
為了降低并發時的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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/555213.html
標籤:JavaScript
上一篇:CSS常用屬性
下一篇:返回列表
