You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义JavaScript findIndex函数异常:查找末尾元素返回-1的原因

问题:自定义findIndex函数无法识别数组末尾元素?

我正在学习JavaScript,尝试编写自定义findIndex函数如下:

function findIndex(array, number) {
  if (number in array) {
    return array.indexOf(number);
  } else {
    return -1;
  }
}

该函数用于查找数组中指定数字的索引,测试情况如下:

console.log(findIndex([1, 2, 3, 4, 5], 3)); // 返回2
console.log(findIndex([1, 2, 3, 4, 5], 6)); // 返回-1
console.log(findIndex([1, 2, 3, 4, 5], 5)); // 返回-1

最后一条输出结果为-1,但执行:

console.log(findIndex([1, 2, 3, 4, 5], 4)); //返回3

却能得到正确索引。为何末尾元素无法被"in"操作符识别,出现此问题?


原因分析

核心问题是误解了in操作符的作用:in操作符检查的是对象的属性名是否存在,而非属性值。

数组本质是特殊的对象,它的"属性名"就是索引(以字符串形式存储的数字,比如"0"、"1"),而不是数组里的元素值。

举个具体例子:

  • 数组[1,2,3,4,5]的索引范围是0到4,对应的属性名是"0"至"4"。
  • 执行5 in array时,实际是检查数组是否有名为"5"的属性(即索引5),但该数组最大索引是4,因此返回false,函数进入else分支返回-1。
  • 执行4 in array时,检查的是索引4是否存在(确实存在,对应元素5),返回true后调用indexOf(4)找到元素4的索引3,这只是巧合得到正确结果,本质逻辑完全错误。

解决办法

你的函数完全不需要in操作符,因为indexOf本身就会在找不到元素时返回-1,最简写法如下:

function findIndex(array, number) {
  return array.indexOf(number);
}

如果想手动实现遍历逻辑(模拟indexOf的行为),可以这样写:

function findIndex(array, number) {
  for (let i = 0; i < array.length; i++) {
    if (array[i] === number) {
      return i;
    }
  }
  return -1;
}

这样无论元素在数组哪个位置,都能正确返回对应的索引。


内容的提问来源于stack exchange,提问作者me-an-ape

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:05:14