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
相关产品推荐
相关产品推荐

