これは、関数に欠落しているパラメーターをチェックする正しい方法ですか? これはすべてのブラウザで機能しますか? 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;
}