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

