JavaScript sumAll函数typeof判断非预期返回ERROR问题排查
问题根因
你的if判断两个条件段都存在逻辑错误,其中第二段条件会永远判定为真,这就是无论传什么数字参数都会直接返回"ERROR"的核心原因:
- 错误1:
(a||b)<0写法不符合预期
JS中||逻辑或运算符的返回规则是返回第一个为真值的操作数,不会对两个操作数分别执行后续的比较逻辑。这个表达式实际只会取出a、b里第一个真值,单独判断这一个值是否小于0,完全无法实现“任意一个参数为负就触发校验”的效果,还会出现漏判。 - 错误2:
(typeof(a)||typeof(b)) !=Number存在两个致命问题typeof运算符的返回值是字符串类型,比如判断数字类型时返回的结果是字符串"number",不是Number构造函数本身。你拿typeof的返回值和Number对象做不等比较,二者类型完全不同,比较结果永远为true。- 同样受
||运算符规则影响,这个写法只会取第一个参数的typeof结果做判断,根本不会校验第二个参数的类型。
修正方案
入参校验需要对两个参数分别做判断,不要用||把参数本身包起来再做统一比较:
// 基础校验写法:匹配“任意参数非数字、任意参数为负就返回ERROR”的要求 if (typeof a !== "number" || typeof b !== "number" || a < 0 || b < 0) { return "ERROR" }
如果要和官方参考解法对齐,推荐用Number.isInteger做校验,可以同时过滤非数字、非整数的非法入参,严谨性更高。
完整修正后的代码如下:
const sumAll = function(a,b) { let c = 0 if (!Number.isInteger(a) || !Number.isInteger(b) || a < 0 || b < 0) { return "ERROR" } if (a < b) { for(let i = a; i <= b; i++){ c += i; } return c; } else { for(let i = b; i <= a; i++){ c += i; } return c; } };
内容的提问来源于stack exchange,提问作者AadhilMoola
相关产品推荐
相关产品推荐

