这两种检查参数的方法有什么区别?
function foo(a, b) {
this.a=a;
this.b=b;
}
使用:
if (arguments.length === 1) {}
或
if (this.b !== undefined) {}
答案 0 :(得分:1)
检查条款是什么?函数可以继续使用默认值/行为,还是应该在错过某些内容时停止?
通常,您是行为的默认值,但这取决于函数的用途/用途:
function foo(a,b){
a = a || {};
b = b || 5;
// continue
}
如果您正在寻找缺席的东西,可以查看undefined
并暂停:
function foo(a){
if (a === undefined){
return false;
}
}
简而言之,这完全取决于您以及在缺少或错误分配变量的情况下您希望函数如何继续运行。另一个例如:
function bar(b){
if (typeof b !== 'function'){
b = function(){};
}
// continue on...
}
答案 1 :(得分:1)
如果要检查强制参数,我将使用arguments.length
作为第一步。如果要检查可选参数,通常模式为:
function foo(a,b){
this.a = a || "foo";
// etc
}
请注意,仅当参数不能为“falsy”值时才有效(因此,空字符串,零,空,未定义,false,NaN)。例如,如果您将空字符串作为a
参数传递,则您将拥有foo。如果您只考虑undefined
作为考虑可选参数的值,那么您必须执行以下操作:
function foo(a){
this.a = a === undefined ? "foo" : a;
// etc
}
如果要同时考虑null和undefined以及可选参数,可以:
function foo(a){
this.a = a == undefined ? "foo" : a;
// etc
}
当然,您也可以使用运算符typeof
。例如,您希望a
只能是一个字符串:
function foo(a) {
this.a = typeof a === "string" ? a : "";
// etc
}
你也可以强制a
始终是一个字符串,在最坏的情况下将是给定的非字符串值的字符串版本(也是未定义的):
function foo(a) {
this.a = String(a);
// etc
}
更复杂的案例有一些实用功能可以让你检查所有这些,你说的是所需的参数,可选的,默认的值等等。
答案 2 :(得分:0)
b!==undefined
很可能是您想要的
如果您执行foo()或f(1,2,3)
,第一个将失败