JavaScript函数specialMix异常排查:非首测试用例返回NaN问题
代码问题排查与修正
你的代码主要存在三个核心问题,导致除第一个测试用例外其余都返回NaN:
1. 全局变量result未重置
result定义在函数外部,属于全局变量。第一次调用specialMix(10,20,30)后result的值变成60,后续调用时不会重新归零;而且当遇到解析后为NaN的字符串时,result += NaN会直接让整个结果变成NaN。
2. NaN的判断逻辑错误
typeof NaN的返回值是"number",所以else if (typeof parseInt(data[i]) === "NaN")这个条件永远不会触发。判断一个值是否为NaN必须用isNaN()函数。
3. "All are strings"的判断时机错误
当前逻辑在循环内判断,无法正确识别所有参数都是无数字字符串的情况,应该在循环结束后,确认没有任何有效数值累加时再输出提示。
修正后的代码
function specialMix(...data) { let result = 0; // 把result放到函数内部,每次调用自动重置 let hasValidNumber = false; // 标记是否有有效数值被累加 for (let i = 0; i < data.length; i++) { const item = data[i]; if (typeof item === "number") { result += item; hasValidNumber = true; } else if (typeof item === "string") { const num = parseInt(item); // 检查解析结果是否为有效数字(排除NaN) if (!isNaN(num)) { result += num; hasValidNumber = true; } } } // 没有任何有效数值时输出提示 if (!hasValidNumber) { console.log("All are strings"); return 0; // 可根据需求调整返回值,比如undefined } return result; } // 测试用例验证 console.log(specialMix(10, 20, 30)); // 60 console.log(specialMix("10Test", "Testing", "20Cool")); // 30 console.log(specialMix("Testing", "10Testing", "40Cool")); // 50 console.log(specialMix("Test", "Cool", "Test")); // All are strings
额外优化说明
- 用
const声明循环内的item和num,符合现代JS变量声明规范 - 增加
hasValidNumber标记,避免出现result为0但实际传入了有效数字(比如0、"0")时的误判
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

