基础 js判断数组包含某个元素的方法有多少?一般可以用这些语法

老实说,使用indexOf()来检查数组元素是否是最方便的方法。
上次我重构一个旧项目时,代码中indexOf()的使用比rice更加勤奋。
例如,有一个场景,需要检查用户输入的ID是否在购物车列表中。
只需要写 cart.indexOf(id) >= 0 就可以了,两行代码就可以完成,这比创建循环直观得多。
当然,前提是数组不是超级巨大,否则indexOf()可能会有点慢。
我记得有一篇博客说,当数组长度超过1 0000项时,indexOf()的搜索效率明显下降。

有趣的是,ES6 中新的 findIndex() 只是 indexOf() 的增强版本。
之前在处理包含嵌套对象的数组时,发现使用 every() 或 some() 特别别扭。
例如,如果你想找到第一个价格超过5 00的商品,你必须使用every()编写一个复杂的回调函数,并且你必须考虑链式调用是否会报错。
结果换成findIndex(),直接传一个函数判断obj.price是否>5 00,代码瞬间刷新。
当然,如果数组充满了简单的数字或字符串,则使用indexOf()即可,但遇到复杂情况时,findIndex()更好。

但是,有一个陷阱需要注意。
在判断是否包含NaN时,indexOf()和普通遍历都救不了你。
因为 NaN === NaN 为 false,所以使用 indexOf(arr.indexOf(NaN) >= 0) 将直接返回 false。
这时候就得使用ES6 的includes(),或者自己写一个函数使用Array.prototype.some() + Number.isNaN。
当时我不明白为什么Array.prototype.includes()可以解决这个bug。
后来查MDN,发现是通过Object.is比较,Object.is(NaN, NaN)为true。

最后一个实用的建议:如果数组数据量不大,indexOf()或includes()完全足够了; 如果数据量大或者条件复杂,优先使用findIndex()。
最近使用Vue过滤列表时,发现使用findIndex()配合compute属性的性能比filter()好很多。
当然,使用哪种方法取决于实际情况,比如数组是否已排序,或者是否存在将来可能需要扩展的条件判断。

js 怎样用includes判断数组是否包含某元素

直接使用include()方法即可。
表包含判断,包含是最直接的。
类型不匹配,包括错误返回。
NaN经过特殊处理,包含可以被识别。
fromIndex 为负数,从后向前查找。
空槽是未定义的,并且包含被认为是正确的。
较旧的浏览器不支持它,indexOf 是一个救星。
对于复杂条件的判断,最好是查找而不是包含。
你自己掂量一下吧。