我有一个像这样的功能 -
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个参数是否存在。
这看起来很难看,而且难以理解。你能建议一种更优雅的方式来实现同样的目标吗?
答案 0 :(得分:1)
可以使用arguments
变量来确定传递的参数数量
if (arguments.length !== 7) {
...
}
但是,这仍然不会告诉您所有这些都是定义的值。为了确定它们是否都已定义,您必须单独检查它们,因为在参数列表中间传递undefined是合法的
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
}
}
答案 1 :(得分:0)
您可以使用arguments.length
来获取实际传递的参数数量。
arguments
是一个“阵列式”内置版。如果你想测试参数是否有值,只需像任何数组一样循环遍历它。 (当然,您可能认为框架中的“查询”方法更优雅,但最终还是某人的循环。)
答案 2 :(得分:0)
每个函数都可以访问arguments
伪数组,其中包含传入的所有参数。
如果你想确保你有7个非null的参数,那么检查看起来像这样:
if (arguments.length != 7 || ![].slice.call(arguments, 0, 7).every(
function(val) { return val != null; })) {
alert("Please pass 7 good arguments");
return;
}
(为了支持较旧的浏览器,你需要为every
方法获取垫片,由于某些原因我没有在MDN上看到
答案 3 :(得分:0)
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
*/