JavaScript无法检测数组中的数字79或16问题排查
问题分析与解决方案
核心问题:in操作符的误用
你遇到的问题根源在于**in操作符并不是用来检查数组元素是否存在的**——它的作用是判断某个属性名是否存在于对象(包括数组,因为数组本质也是对象)中。对于数组来说,x in arr检查的是arr是否有索引为x的属性,而不是x是否是数组的元素值。
为什么大部分情况看似正常?举个例子:如果你的usedIdArray里的元素刚好和数组索引重合(比如数组是[0,1,2]),那1 in arr会返回true,这时候看起来像是元素存在的判断生效了。但当目标ID是一个大于数组长度的数字,或者数组里的元素不是连续的索引值时,in就会直接失效——这就是你说的“带有...的节点”检测失败的原因,它们的ID值大概率不是数组的有效索引。
正确的实现方式
要检查数字是否存在于整数数组中,应该使用专门针对数组元素的方法:
使用
Array.includes()(推荐,ES6+)
语义清晰,直接检查元素是否在数组中:if (!usedIdArray.includes(results[count].m._id)) { // 你的业务逻辑代码 }使用
Array.indexOf()(兼容旧环境)
如果需要支持ES6之前的运行环境,可以用indexOf判断返回值是否为-1(表示元素不存在):if (usedIdArray.indexOf(results[count].m._id) === -1) { // 你的业务逻辑代码 }
验证场景
假设usedIdArray是[100, 200, 300],目标ID是200:
- 用
200 in usedIdArray会返回false(因为数组的索引只有0、1、2,没有200这个索引),直接导致检测失效; - 用
usedIdArray.includes(200)会返回true,完全符合预期。
这就能完美解释为什么只有特定节点出现检测失效的问题了。
内容的提问来源于stack exchange,提问作者Austin Capobianco
相关产品推荐
相关产品推荐

