我们平时在 JavaScript 的开发中,我们会遇到一些需求:检测集合中是否包含了某一个元素,我们会使用两种方式:
- Set.prototype.has()
- Array.prototype.includes()
对于这两种方式,其实都能完成我们的需求,但是其实这两种方式是有差异的,那就是性能差异
接下来我们可以先来看看 Set 和 Array 在查找元素的时候,方式到底有哪些区别
- Set: 查找操作(has())在Set中通常是O(1),即常数时间复杂度。这是因为Set是基于哈希表实现的,它能够快速判断元素是否已经存在,当你需要频繁检查某个元素是否存在时,Set提供了更优的性能
- Array: 查找操作(includes())在Array中是O(n),即线性时间复杂度,因为 JavaScript 中的数组是基于索引的线性结构。数组需要遍历每个元素,直到找到目标元素,如果你频繁需要检查元素是否存在,Array在性能上可能不如Set
小数据场景
如果我们的集合比较小的时候,使用 Set.prototype.has() 或 Array.prototype.includes() 会有什么性能上的差异呢?我们可以来测一测
图片
我们将这两个代码放到测试平台上测:https://bestcodes.dev/projects/codeperf
可以发现,当集合数据量比较小的时候,没有什么明显的数据差异,但是可以看出 Set.prototype.has() 的性能领先了一丢丢
图片
大数据场景
现在我们来进行大数据的场景,就把数据量加大到 1000000 个元素
图片
可以看出 Set.prototype.has() 性能更好
图片