JavaScript求和函数参数类型判断错误问题排查
问题
我是编程新手,代码略显冗长,在此致歉。我想要实现一个求和函数,当传入的参数为字符串或数组时返回'ERROR',但第一个if条件判断始终触发返回,即使传入的是数字或数字字符串也不例外。
我的思路是:如果num1/num2是字符串,typeof num1 === Number会返回false,取反后为true,从而满足条件。代码如下:
if (!(typeof num1 === Number) || !(typeof num2 === Number)) { return 'ERROR'; }
但仅传入数字时,该条件仍为true并返回'ERROR',这不符合预期,因为此时条件应为false并执行后续代码。
我怀疑自己对typeof运算符与Number的相等判断存在理解误区,特此求助。以下是完整代码:
const sumAll = function(num1, num2) { let sum = 0; if (!(typeof num1 === Number) || !(typeof num2 === Number)) { return 'ERROR'; } if (num1 >= 0 && num2 >= 0) { if (num2 >= num1) { for (let i = num1; i <= num2; i++) { sum += i; } } else { for (let i = num2; i <= num1; i++) { sum += i; } } return sum; } else if (num1 < 0 || num2 < 0) { return 'ERROR'; } }; sumAll(1, 4)
问题分析与解决
你的核心错误在于对typeof运算符的返回值理解有误:
typeof的返回值是小写字符串类型,比如判断数字时返回'number',而非构造函数Number。- 你写的
typeof num1 === Number永远会返回false(字符串和构造函数不可能相等),取反后!(false)就是true,所以不管传入什么参数,第一个if条件都会触发,直接返回'ERROR'。
修改后的代码
把判断条件里的Number换成字符串'number'即可,同时可以优化冗余的逻辑:
const sumAll = function(num1, num2) { let sum = 0; // 校验参数是否为数字类型 if (typeof num1 !== 'number' || typeof num2 !== 'number') { return 'ERROR'; } // 校验参数是否为负数 if (num1 < 0 || num2 < 0) { return 'ERROR'; } // 优化求和逻辑,无需写两个for循环 const start = Math.min(num1, num2); const end = Math.max(num1, num2); for (let i = start; i <= end; i++) { sum += i; } return sum; }; console.log(sumAll(1, 4)); // 输出10
额外说明
如果需要支持数字字符串(比如sumAll('1', '4')也能正常计算),可以调整参数校验逻辑:
// 校验参数是否为数字或可转为有效数字的字符串 if (isNaN(Number(num1)) || isNaN(Number(num2))) { return 'ERROR'; } // 将参数转为数字类型 num1 = Number(num1); num2 = Number(num2);
内容的提问来源于stack exchange,提问作者M Codet
相关产品推荐
相关产品推荐

