在这里举一个例子:
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);
}
^似乎有效,但它是最好的方法吗?
答案 0 :(得分:4)
如果没有传递参数,b
为undefined
,而不是null
。因此,测试参数b
是否存在的正确方法是:
function a(b){
console.log(b !== undefined ? 1 : 2);
}
建议使用 !==
,因为如果您使用==
或!=
,则null和undefined可以强制相等,但使用!==
或===
则不会做类型强制,这样你就可以严格判断它是否undefined
。
答案 1 :(得分:2)
你可以使用undefined
的虚假性质(一个参数,实际上没有传递undefined
,而不是null
)并且只写:
(!b)?1:2
但0
,null
和""
(假值)也是如此。
如果你想以防弹的方式写它,你可以去:
typeof(b) === "undefined"
// or thanks to the write protection for undefined in html5
b === undefined
更新:感谢EcmaScript 2015,我们现在可以使用default parameters:
function a(b = 1){
console.log(b);
}
如果一个参数未定义 - 无论是ommited还是明确地移交(这里你应该使用null
) - 将使用默认值,所有其他值保持不变(也是假的)。 Demonstration