これは、関数に欠落しているパラメーターをチェックする正しい方法ですか? これはすべてのブラウザで機能しますか? IEはどうですか?
function getName(name){
name = name != null ? name : "default";
return name;
}
これは、関数に欠落しているパラメーターをチェックする正しい方法ですか? これはすべてのブラウザで機能しますか? IEはどうですか?
function getName(name){
name = name != null ? name : "default";
return name;
}
パラメーターを確認する方法は、関数に渡す情報の種類と、関数で特殊なケースを処理する方法によって異なります。
ほとんどの場合、次を使用できます。
...
bar = bar || ...default value here...
...
false
ただし、偽の値 ( 、0
、NaN
、''
、undefined
)を渡したい場合は問題になる可能性がありますnull
。
function foo(bar) {
bar = bar || 5
console.log(bar)
}
foo() // 5
foo(undefined) // 5
foo(null) // 5
foo(1) // 1
foo(0) // 5, probably not what you wanted
代わりに、以下をチェックできますundefined
。
...
if (bar == undefined) {
bar = 5
}
...
...しかし、緩やかなチェックを使用すると、 と の両方null
をundefined
上書きできます ( null == undefined
):
function foo(bar) {
if (bar == undefined) {
bar = 5
}
console.log(bar)
}
foo() // 5
foo(undefined) // 5
foo(null) // 5
foo(1) // 1
したがって、代わりに、厳密な等値比較 ( ===
) が一般的に好まれます ( null !== undefined
):
function foo(bar) {
if (bar === undefined) {
bar = 5
}
console.log(bar)
}
foo() // 5
foo(undefined) // 5
foo(null) // null
foo(1) // 1
ES2015 ではデフォルト パラメータが導入されました。これは、以下に対する厳密なチェックと本質的に同等undefined
です。
function foo(bar = 5) {
console.log(bar)
}
foo() // 5
foo(undefined) // 5
foo(null) // null
foo(1) // 1
undefined
がパラメーターとして渡されたかどうかを知る必要がある場合、これは問題を引き起こす可能性があります。
提供された引数を渡していないことを絶対に確認したい場合は、関数に渡された引数の数を確認できます。
...
if (arguments.length < 1) {
bar = 5
}
...
undefined
つまり、別のデフォルトを使用することを選択しながら、引数として正常に渡すことができます。
function foo(bar) {
if (arguments.length < 1) {
bar = 5
}
console.log(bar)
}
foo() // 5
foo(undefined) // undefined
foo(null) // null
foo(1) // 1
複数のパラメータがある場合は、複数のデフォルトを使用することができます。私は最近、switch ステートメントでのフォールスルーの使用例を見つけましたが、ユーティリティには疑問があります。
function foo(bar, baz, fizz, buzz) {
switch (arguments.length) {
case 0:
bar = 1;
//continue; might as well point out that implicit fall-through is desired
case 1:
baz = 2;
//continue;
case 2:
fizz = 3;
//continue;
case 3:
buzz = 4;
//continue;
}
console.log(bar, baz, fizz, buzz)
}
foo() // 1 2 3 4
foo(10) // 10 2 3 4
foo(10, 20) // 10 20 3 4
foo(10, 20, 30) // 10 20 30 4
foo(10, 20, 30, 40) // 10 20 30 40
できるよ:
name = name || 'default';
つまり、name
が未定義または偽 ( null
、0
、""
、false
、 ) の場合は{}
、[]
に設定し"default"
ます。
js(h|l)int はそれについて不平を言うでしょうが、少なくとも IE7 までさかのぼって動作します。無効なコードではなく、文書化されていない動作に依存しているわけでもありません。
正しい確認方法は、
if (typeof name === "undefined") {
// ...
}
もちろんgetName(undefined)
、パラメーターが提供されている場合でも、呼び出し元は を呼び出して「だます」ことができますが、それにもかかわらず、チェックでは提供されていないというフラグが立てられます。しかし、それは本当に病的なシナリオです。
はい、これはすべてのブラウザーで機能しますが、定義されているかどうかを確認したい場合は、次を使用できます。
function getName(name){
name = typeof(name) !== "undefined" ? name : "default";
return name;
}