JavaScript 数组求和时整型值意外转换为字符串问题求助
问题根因
你代码的核心问题是误用了for...in语法遍历数组:
for...in设计用于遍历对象的可枚举属性,当作用于数组时,返回的是字符串格式的数组索引,不是数组元素本身- 你累加时直接把字符串类型的索引和
total相加,触发了JS的隐式类型转换,数字和字符串相加会自动转成字符串拼接,所以最终得到了拼接后的字符串结果
修复方案
- 把遍历数组的
for...in替换为for...of,直接获取数组元素 - 可根据需求简化sum函数的参数判断逻辑,避免不必要的分支
完整可运行修复代码
// range函数逻辑正常,无需修改 function range(start, end, step = 1) { let iterator = start; let array = new Array(); while(iterator <= end) { array.push(iterator); iterator += step; } return array; } // 修复后的sum函数,同时支持直接传入多个数字、一维数组、多维数组参数 function sum(...inputs) { let total = 0; // 自动扁平化所有层级的数组 const numList = inputs.flat(Infinity); for(const num of numList) { total += num; } return total; } console.log(sum(range(1,10))); // 正确输出55
如果你希望保留原有逻辑框架,仅做最小改动,可参考如下修改:
function sum(...inputs) { let total = 0; if(inputs[0] instanceof Array) { // 仅把for...in替换为for...of即可 for(const input of inputs[0]) { total += input; } } else { for(const input of inputs) { total += input; } } return total; }
内容的提问来源于stack exchange,提问作者Israel Hoffman
相关产品推荐
相关产品推荐

