使用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);
}

==,因为如果使用
=
,可以强制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);
}