You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:43:33