使用null-JavaScript检查传递的参数
以下面的函数为例:使用null-JavaScript检查传递的参数,javascript,function,parameters,typeof,Javascript,Function,Parameters,Typeof,以下面的函数为例: function a(b){ console.log(b != null ? 1 : 2); } 该代码运行良好,如果传递参数,则打印1,如果未传递参数,则打印2 然而,JSLint给了我一个警告,告诉我应该使用严格的等式,即==。无论是否传递参数,当使用时,函数将打印1== 所以我的问题是,检查参数是否已传递的最佳方法是什么?我不想使用arguments.length,或者实际上根本不想使用arguments对象 我试着用这个: function a(b){
function a(b){
console.log(b != null ? 1 : 2);
}
该代码运行良好,如果传递参数,则打印1,如果未传递参数,则打印2
然而,JSLint给了我一个警告,告诉我应该使用严格的等式,即==代码>。无论是否传递参数,当使用时,函数将打印1==代码>
所以我的问题是,检查参数是否已传递的最佳方法是什么?我不想使用arguments.length
,或者实际上根本不想使用arguments
对象
我试着用这个:
function a(b){
console.log(typeof(b) !== "undefined" ? 1 : 2);
}
^这似乎是可行的,但这是最好的方法吗?您可以使用未定义的错误性质(未传递的参数实际上是未定义的,而不是null
),只需编写:
(!b)?1:2
但是,对于0
、null
和”
(falsy值)也是如此
如果你想用防弹的方式写,你可以:
typeof(b) === "undefined"
// or thanks to the write protection for undefined in html5
b === undefined
更新:由于EcmaScript 2015,我们现在可以使用:
如果某个参数未定义(无论是ommited还是显式移交(此处您应使用null
),则将使用默认值,所有其他值保持不变(也包括falsy值) 当未传递任何参数时,b
是未定义的
,而不是null
。因此,测试参数b
是否存在的正确方法是:
function a(b){
console.log(b !== undefined ? 1 : 2);
}
==建议使用code>,因为如果使用=
或,可以强制null和undefined相等=代码>,但使用==
或==
不会执行类型强制,因此您可以严格地判断它是否为未定义的
。如果通过未定义的
,则会得到假阴性<代码>参数。长度(或变体)是查看参数是否已传递的唯一方法。@Esailija如果函数无意显式使用未定义的值,在我看来,这应该没问题。函数没有责任捕获所有可能的用户错误。@Christoph如果您真的需要知道是否传递了参数,那么它就不好了。如果您只想知道参数是空的还是其他什么,那么!=空未定义的
等都是一样脆弱和好的,没有防弹功能。更喜欢!=null
可同时检查未定义的
和null
。@Esailija传递参数时是否带有值未定义的
,或者如果函数不接受未定义的值,则根本不需要参数<但是,code>null
表示传递了一个参数,因为它不同于undefined
,如果没有传递参数,则会出现这种情况。所以我不会用检查=null
这就是为什么我说如果你真的需要知道:P当然需要知道这一点是不正常的。顺便说一句,如果你想对没有传递给函数的变量使用默认值,你可以编写类似b=b | | defaultValue
的东西。如果(!b){defaultValue;}
,这是一个常见的JS习语,如果(!b
如果b
是0
,false
,null
,未定义的
,或”,这是个坏主意,因为你永远不能通过0
或。@jakub.g
以这种方式作为参数。当使用默认值时,你应该以安全的方式检查它,而不是使用falsy nature。没错。但是,当预期参数应该是对象(b=b | |{}
)时更有意义。@Keir Simmons i冒昧地根据最新的Ecmascript标准更新了答案。随便看看;)为了完整性,可以在函数中去掉typeof
,因为我们在函数范围内,undefined
在此不能被覆盖:)在全局范围内,使用typeof(foo)!=“未定义”
。
function a(b){
console.log(b !== undefined ? 1 : 2);
}