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

JavaScript函数执行返回NaN结果的代码错误排查

函数返回NaN的原因

你这段实现打家劫舍算法的JS函数运行返回NaN,核心触发点是数组越界访问,具体问题如下:

  • 循环终止条件是i < nums.length,当i遍历到数组末尾位置时,你代码里访问的nums[i+1]、nums[i+2]已经超出数组的有效索引范围。JS中访问数组不存在的索引不会抛出异常,只会返回undefined,当数字类型和undefined执行加法运算时,结果就会是NaN,一旦累加过程中出现NaN,后续所有累加结果都会是NaN。
  • 以你传入的测试用例[1,2,3,1]为例,数组合法索引是0-3:
    • 当i=2时,i+2=4,nums[4]为undefined,此时a += 3 + undefined已经得到NaN
    • 当i=3时,i+1=4、i+2=5,两个位置都是undefined,会进一步让b也变成NaN
  • 除了越界问题,你当前的累加逻辑本身也不符合打家劫舍的动态规划规则:每轮循环重复累加相邻位置的数值,就算修复越界问题,也会因为重复计算得到错误结果,无法算出不相邻盗窃的最大金额。
修正后的参考实现
var rob = function(nums) {
  if (nums.length === 0) return 0;
  if (nums.length === 1) return nums[0];
  // 滚动变量存储前前位、前一位的最大可盗窃金额
  let a = 0, b = 0;
  for (let i = 0; i < nums.length; i++) {
    // 偷当前位就不能偷前一位,取前前位最大值+当前金额;不偷当前位就取前一位最大值
    const temp = Math.max(b, a + nums[i]);
    a = b;
    b = temp;
  }
  return b;
};
console.log(rob([1,2,3,1])); // 输出正确结果4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:15:40