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

JavaScript求相邻数组元素乘积最大值的NaN错误排查

解决相邻元素乘积最大值的NaN问题

嘿,我来帮你搞定这个NaN错误的问题~首先可以明确地说:你遇到的NaN和循环执行顺序完全没关系,JavaScript里的for循环是同步执行的,你看到console.log(products)能正确打印数组,说明循环已经跑完了,问题出在你的循环逻辑本身,导致products数组里混入了NaN,进而让Math.max(...products)返回NaN。

问题根源拆解

你的代码有两个关键错误:

  • 循环条件错误:你写的i <= inputArray.length会让循环最后一次执行时,i等于数组的长度,这时候inputArray[i]是undefined,inputArray[i+1]也是undefined,两者相乘的结果就是NaN,被push到了products数组里。
  • 对“相邻元素对”的理解错误:题目要求的是索引连续的相邻元素(比如数组[2,3,5,10,2,4]的相邻对是(2,3)、(3,5)、(5,10)、(10,2)、(2,4)),但你设置步长为2,相当于每隔一个元素取一对,完全偏离了题目的要求!

修正后的代码

先给你最贴合你原有思路的修正版本,只调整循环的条件和步长:

function adjacentElementsProduct(inputArray) {
  var products = [];
  // 循环到i < inputArray.length - 1,确保i+1不会超出数组索引范围
  for(var i = 0; i < inputArray.length - 1; i++) {
    products.push(inputArray[i] * inputArray[i + 1]);
  };
  console.log(products); // 现在会输出[6, 15, 50, 20, 8]
  console.log(Math.max(...products)); // 正确返回50
  return Math.max(...products);
}

如果想更高效(不需要额外创建数组),可以直接在循环里跟踪最大值:

function adjacentElementsProduct(inputArray) {
  // 初始化最大值为第一对相邻元素的乘积
  let maxProduct = inputArray[0] * inputArray[1];
  // 从第二个元素开始遍历到倒数第二个元素
  for(let i = 1; i < inputArray.length - 1; i++) {
    const currentProduct = inputArray[i] * inputArray[i + 1];
    maxProduct = Math.max(maxProduct, currentProduct);
  }
  return maxProduct;
}

再解释下你的疑惑

你担心“循环完成前调用Math.max”是多余的,因为JavaScript的同步代码是按顺序执行的,for循环会完全执行完毕后,才会执行后面的console.log和return语句。你之前看到的products数组“正确打印”,可能是因为前面的元素都是正常数值,最后藏了一个NaN没注意到,你可以仔细看看之前的products数组,最后一项应该是NaN哦~

内容的提问来源于stack exchange,提问作者Nick Kinlen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:21:39