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