以优雅的方式检查多个参数的存在

checking the existence of multiple arguments in an elegant manner

本文关键字:参数 存在 方式 检查      更新时间:2023-09-26

我有一个这样的函数-

var myFunction  = function(arg1, arg2, arg3, arg4, arg5, arg6, arg7){
    if(typeof arg1 != 'undefined' && typeof arg2 attributeId != 'undefined' && typeof arg3 != 'undefined'){ //and so on for all the arguments
    //do something with all of the arguments
    }
}

基本上,在做某事之前,我会检查是否所有7个论点都存在。

这看起来很难看,无法阅读。你能建议一种更优雅的方式来实现同样的目标吗?

可以使用arguments变量来确定传递的参数数量

if (arguments.length !== 7) {
  ...
}

然而,这仍然不会告诉你所有这些都是已定义的值。为了确定它们是否都已定义,您必须单独检查它们,因为在参数列表中间传递未定义是合法的

myFunction(1, 2, undefined, 4, 5, 6, 7);

也许最好的方法是将其抽象为一个单独的函数

var allDefined = function(args) {
  var i = 0;
  for (i = 0; i < args.length; i++) {
    if (typeof args[i] === 'undefined') {
      return false;
    }
  }
  return true;
}
var myFunction  = function(arg1, arg2, arg3, arg4, arg5, arg6, arg7) {
  if (arguments.length === 7 && allDefined(arguments)) {
    // They're all there
  }
}

您可以使用arguments.length来获取实际传递的参数数。

arguments是一个"类数组"的内置程序。如果您想测试参数是否有值,只需像测试任何数组一样对其进行循环即可。(当然,您可能会认为来自框架的"查询"方法更优雅,但最终是某人的循环。)

每个函数都可以访问arguments伪数组,该数组包含传入的所有参数。

如果你想确保你有7个参数不是空的,那么检查会像这样:

if (arguments.length != 7 || ![].slice.call(arguments, 0, 7).every(
       function(val) { return val != null; })) {
       alert("Please pass 7 good arguments");
       return;
}

演示

(为了支持较旧的浏览器,您需要为every方法获取一个填充程序,出于某种原因,我在MDN上没有看到它)

var myFunction= function(){
    var i= 7, a= arguments;
    while(i){
        if(a[--i]== undefined) return new Error('Expected 7 arguments')
    }
    return a.length;
    //the first 7 arguments are not null or undefined
    // they could be false, '', 0 or NaN
}
myFunction(1, 2, 3, 4, 5, '', 7)
/*  returned value: (Number)
7
*/
myFunction(1, 2, 3, 4, 5, null, 7)
/*  returned value: (Error)
Error: Expected 7 arguments
*/