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

JavaScript变量初始化疑问:未初始化变量求和为何返回NaN?

为什么未初始化的r1/r2会导致NaN,而未初始化的total却能得到运算结果?

核心原因:undefined的运算规则 + 变量赋值逻辑差异

先明确JavaScript的基础规则:用let声明但未赋值的变量,初始值是**undefined**,而undefined和数字进行算术运算时会被转换为NaN(非数字),且NaN参与任何算术运算的结果都是NaN。

1. 为什么r1、r2未初始化会变成NaN?

看你代码里的累加逻辑:

for (let i = 0; i < arr_1.length; i++) r1 += arr_1[i];

r1 += arr_1[i]等价于r1 = r1 + arr_1[i]。因为r1一开始是undefined,第一次运算就是undefined + 3(数组第一个元素),结果直接变成NaN。之后每一次累加都是NaN + 数字,结果还是NaN,所以最终r1、r2全是NaN。

2. 为什么total未初始化却能得到“运算结果”?

total的逻辑是直接赋值,而非基于自身原值运算:

total = r1 + r2;

哪怕r1和r2都是NaN,r1 + r2的运算结果仍是NaN,这个值会被直接赋给total。也就是说,total虽然一开始是undefined,但函数执行时它被赋予了运算后的结果(哪怕结果是NaN),所以最终打印的不是undefined,而是运算出来的NaN。

如果total从未被赋值(比如注释掉total = r1 + r2这行),它才会保持undefined。

3. 初始化r1、r2为0为什么能解决问题?

当r1初始化为0时,第一次累加是0 + 3 = 3,之后每一次都是数字加数字,能正常累加出数组的总和,r2同理。最后total = 276 + 351 = 627,自然得到正确结果。

额外建议:尽量避免全局变量

你的代码里r1、r2、total都是全局变量,这不是好的写法。可以把变量放到函数内部,避免全局污染:

function totalSum(arr_1, arr_2) {
  let r1 = 0;
  let r2 = 0;
  for (let i = 0; i < arr_1.length; i++) r1 += arr_1[i];
  for (let j = 0; j < arr_2.length; j++) r2 += arr_2[j];
  return r1 + r2;
}

const arr_1 = [3, 5, 22, 5, 7, 2, 45, 75, 89, 21, 2];
const arr_2 = [9, 2, 42, 55, 71, 22, 4, 5, 90, 25, 26];

const total = totalSum(arr_1, arr_2);
console.log(`total=${total}`);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:37:20