Javascript中array.length返回值翻倍,求和结果异常原因咨询
问题分析:数组求和结果翻倍的原因
我正在通过书籍学习JavaScript,书中一道练习要求编写两个函数:一个根据传入的两个数字生成数组,另一个对数组内所有数字求和。我的代码如下:
let beg = 1; let end = 3; array = []; sumNum = 0; function range(begg, endd) { for (let count = begg; count <= endd; count++) { array.push(count); } return array; } console.log(range(beg, end)); function sum(arrayy) { for (let i = 0; i <= arrayy.length - 1; i++) { sumNum = arrayy[i] + sumNum; console.log(sumNum); } console.log("\n") console.log(arrayy.length - 1); return sumNum / 2; } console.log(sum(range(beg, end))); array2 = [1, 2, 3]; console.log("\n"); console.log(array2.length);
运行代码后,我发现数组求和结果始终是预期值的两倍,array.length返回值和循环执行次数也翻倍,以下是输出内容:
[ 1, 2, 3 ] 1 3 6 7 9 12 5 6 3
问题原因
全局数组被重复填充:你定义的
array是全局变量,第一次调用range(beg, end)时,数组被填充为[1,2,3];当执行sum(range(beg, end))时,第二次调用range会直接在已有数组的基础上继续添加元素,导致数组变成[1,2,3,1,2,3],长度变为6,所以你看到arrayy.length -1输出5。全局累加变量未重置:
sumNum同样是全局变量,第一次循环求和后它的值是6;第二次求和时没有重置为0,而是在6的基础上继续累加新数组的元素,最终得到6+6=12,这就是你需要返回sumNum/2才能得到正确结果的原因。
修正方案
把array和sumNum改成函数内部的局部变量,每次调用函数时都会重新初始化,避免全局变量的复用问题:
let beg = 1; let end = 3; function range(begg, endd) { const array = []; // 局部变量,每次调用重新创建 for (let count = begg; count <= endd; count++) { array.push(count); } return array; } console.log(range(beg, end)); function sum(arrayy) { let sumNum = 0; // 局部变量,每次调用重置为0 for (let i = 0; i < arrayy.length; i++) { // 简化循环条件,无需减1 sumNum += arrayy[i]; console.log(sumNum); } console.log("\n"); console.log(arrayy.length - 1); return sumNum; } console.log(sum(range(beg, end))); const array2 = [1, 2, 3]; console.log("\n"); console.log(array2.length);
内容的提问来源于stack exchange,提问作者Mak Vinícius
相关产品推荐
相关产品推荐

