Set.has 和 Array.includes 到底應(yīng)該用哪個?
我們平時在 JavaScript 的開發(fā)中,我們會遇到一些需求:檢測集合中是否包含了某一個元素,我們會使用兩種方式:
- Set.prototype.has()
- Array.prototype.includes()
對于這兩種方式,其實都能完成我們的需求,但是其實這兩種方式是有差異的,那就是性能差異
接下來我們可以先來看看 Set 和 Array 在查找元素的時候,方式到底有哪些區(qū)別
- Set: 查找操作(has())在Set中通常是O(1),即常數(shù)時間復(fù)雜度。這是因為Set是基于哈希表實現(xiàn)的,它能夠快速判斷元素是否已經(jīng)存在,當(dāng)你需要頻繁檢查某個元素是否存在時,Set提供了更優(yōu)的性能
- Array: 查找操作(includes())在Array中是O(n),即線性時間復(fù)雜度,因為 JavaScript 中的數(shù)組是基于索引的線性結(jié)構(gòu)。數(shù)組需要遍歷每個元素,直到找到目標(biāo)元素,如果你頻繁需要檢查元素是否存在,Array在性能上可能不如Set
小數(shù)據(jù)場景
如果我們的集合比較小的時候,使用 Set.prototype.has() 或 Array.prototype.includes() 會有什么性能上的差異呢?我們可以來測一測
圖片
我們將這兩個代碼放到測試平臺上測:https://bestcodes.dev/projects/codeperf
可以發(fā)現(xiàn),當(dāng)集合數(shù)據(jù)量比較小的時候,沒有什么明顯的數(shù)據(jù)差異,但是可以看出 Set.prototype.has() 的性能領(lǐng)先了一丟丟
圖片
大數(shù)據(jù)場景
現(xiàn)在我們來進行大數(shù)據(jù)的場景,就把數(shù)據(jù)量加大到 1000000 個元素
圖片
可以看出 Set.prototype.has() 性能更好
圖片