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

JavaScript简易计算器:抽离校验函数后参数数量校验失效问题

问题:封装校验函数后参数数量校验失效的原因及解决办法

我正在用JavaScript开发一款用于作业的简易计算器,需要校验输入必须是两个数字,否则抛出错误。最初的加法函数中,使用arguments.length校验参数数量的逻辑正常,但将校验逻辑封装为inputValidation函数后,Number.isFinite的数字校验仍正常,而参数数量校验却失效了,测试提示“AssertionError [ERR_ASSERTION]: Missing expected exception (Error)”,请问问题出在哪里?

原代码

function add(number1, number2) {
  if (arguments.length !== 2) {
    throw new Error('Please supply two numbers');
  }
  if (!Number.isFinite(number1) || !Number.isFinite(number2)) {
    throw new Error('Only numbers are allowed');
  }
  return number1 + number2;
}

重构后代码

function inputValidation(number1, number2) {
  if (arguments.length !== 2) {
    throw new Error('Please supply two numbers');
  }
  if (!Number.isFinite(number1) || !Number.isFinite(number2)) {
    throw new Error('Only numbers are allowed');
  }
}

function add(number1, number2) {
  inputValidation(number1, number2);
  return number1 + number2;
}

测试报错

1) error is thrown if not exactly two arguments
       should throw Please supply two numbers:
     AssertionError [ERR_ASSERTION]: Missing expected exception (Error).

原因分析

问题核心在于arguments对象的作用域限制:

  • 原代码里,arguments属于add函数的局部对象,它记录的是调用add时传入的参数数量,所以能准确校验用户是否传了两个参数。
  • 重构后,inputValidation里的arguments是它自己的局部对象。不管用户给add传几个参数,调用inputValidation(number1, number2)时,都会给它传两个值(没传的参数会是undefined),所以arguments.length永远等于2,参数数量校验完全失效。

解决办法

要校验add的参数数量,必须基于add函数的调用参数来判断,以下是几种可行方案:

方案1:在add内部先做参数数量校验

把参数数量校验留在add里,只把数字合法性校验封装到inputValidation:

function inputValidation(number1, number2) {
  if (!Number.isFinite(number1) || !Number.isFinite(number2)) {
    throw new Error('Only numbers are allowed');
  }
}

function add(number1, number2) {
  if (arguments.length !== 2) {
    throw new Error('Please supply two numbers');
  }
  inputValidation(number1, number2);
  return number1 + number2;
}

方案2:传递add的arguments给校验函数

把add的arguments对象传给inputValidation,让校验函数基于这个对象判断参数数量:

function inputValidation(args) {
  if (args.length !== 2) {
    throw new Error('Please supply two numbers');
  }
  if (!Number.isFinite(args[0]) || !Number.isFinite(args[1])) {
    throw new Error('Only numbers are allowed');
  }
}

function add(number1, number2) {
  inputValidation(arguments);
  return number1 + number2;
}

方案3:用ES6剩余参数(更推荐)

如果环境支持ES6,剩余参数语法比arguments更清晰直观:

function inputValidation(num1, num2) {
  if (num1 === undefined || num2 === undefined) {
    throw new Error('Please supply two numbers');
  }
  if (!Number.isFinite(num1) || !Number.isFinite(num2)) {
    throw new Error('Only numbers are allowed');
  }
}

function add(...args) {
  inputValidation(...args);
  return args[0] + args[1];
}

或者直接在add里通过剩余参数判断数量:

function inputValidation(num1, num2) {
  if (!Number.isFinite(num1) || !Number.isFinite(num2)) {
    throw new Error('Only numbers are allowed');
  }
}

function add(...args) {
  if (args.length !== 2) {
    throw new Error('Please supply two numbers');
  }
  inputValidation(...args);
  return args[0] + args[1];
}

内容的提问来源于stack exchange,提问作者santa_cloudy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:40:51