array.prototype.includes 和 Set.has() 哪一个更好

在讲这个问题之前,先说说最近开发的感想,我们平时开发的时候免不了需要轮询一段数据,但是怎样才能使用轮询的时候减少性能的消耗呢,在看了php后端小伙伴用了一个isset函数之后,才突然有点灵感,就是我们在写代码,不要硬生生的使用循环,可以学会使用语言的内置方法,比如在我们前端中,与isset相似的方法有哪些,includes 就是其中一个,但是includes真的有那么好吗,除了includes还有其他方法吗?我们接下来可以分析下。

什么是时间复杂度?
使用 Array 去查找是一个为 O(N) 的线性时间复杂度。换句话说,随着数据量的提高,运行时间随着增加。
相比而言,使用 Set 去查找,不管是删除还是插入的时间复杂度都仅仅是 O(1)——这意味着,运行时间不随着数量的提高而增加。

Set 有何不同?
根本的区别就是 Array 是 索引集合(index collection)。这意味着,数据的值是以 索引(index) 排序的。

const arr = [A, B, C, D];
console.log(arr.indexOf(A));// Result: 0
console.log(arr.indexOf(C));// Result: 2

而 Set 则是 键集合(keyed collection)。相比使用 索引,Set 使用 键 来组织它的数据。一个 Set 中所有项都是按插入顺序可迭代的,它不会有重复值。换句话说,Set 中的每一项都是独一无二的。

Set 相比 Array 有些优势,特别是考虑到需要更快的运行时间:

查找项: 使用 indexOf() 或 includes() 去检查一个项是否在数组中很慢。
删除项: 在 Set 中,你可以使用 值 去删除一项。而在 Array 中,相同的功能需要使用项的 索引 使用 splice()方法。使用 索引 是很慢的
插入项: 在 Set 中新增一项比 Array 使用 push() 或者 unshift() 等方法新增一项要快的多。
排序NaN值: 你无法使用 Array 的 indexOf() 或者 includes() 去定位 NaN 值,但是 Set 可以并且能够存储这个值
去重: Set 对象只存储独一无二的值,如果你想避免储存重复值,这是比 Array 更好的选择,因为使用 Array,你需要使用额外的代码去处理这种情况。

不过有些小伙伴有疑问了,前端处理的数据比后端的小,用得着需要考虑时间复杂度这些吗?
这个问题问得非常好!

一般在客户端下我们的操作的数据不会很多,单个页面上千的数据映射到DOM上已经非常卡了,更别说更高的数量级了,客户端考虑一下如何减少重排重绘要比考虑使用Array还是Set能减少更多的开销,在服务端合理的设计可能会比考虑这个带来更大的优化。

不过还有小伙伴会问在前端什么样情况下用includes,什么样的情况用set的呢
这个问题问得也不错~
以下摘自一位大神:

在这里插入图片描述
以上大概的意思总结:因为构造set的过程本身就是遍历的过程,所以只用来查询一次的话,就用includes就好了,查询多次可以使用set

以上部分内容摘自以下链接:
https://www.5axxw.com/questions/content/oiqrpp
https://www.cnblogs.com/ZerlinM/p/13600329.html
https://blog.csdn.net/weixin_30872337/article/details/100092840
https://stackoverflow.com/questions/53423914/performance-of-array-includes-vs-mapping-to-an-object-and-accessing-it-in-javasc
https://www.zhihu.com/question/330518732

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值