29

これは、関数に欠落しているパラメーターをチェックする正しい方法ですか? これはすべてのブラウザで機能しますか? IEはどうですか?

function getName(name){
    name = name != null ? name : "default";
    return name;
}
4

4 に答える 4

61

パラメーターを確認する方法は、関数に渡す情報の種類と、関数で特殊なケースを処理する方法によって異なります。

ほとんどの場合、次を使用できます。

...
bar = bar || ...default value here...
...

falseただし、偽の値 ( 、0NaN''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
}
...

...しかし、緩やかなチェックを使用すると、 と の両方nullundefined上書きできます ( 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

于 2012-10-03T19:17:12.440 に答える
24

できるよ:

name = name || 'default';

つまり、nameが未定義または偽 ( null0""false、 ) の場合は{}[]に設定し"default"ます。

js(h|l)int はそれについて不平を言うでしょうが、少なくとも IE7 までさかのぼって動作します。無効なコードではなく、文書化されていない動作に依存しているわけでもありません。

于 2012-10-03T19:08:34.917 に答える
9

正しい確認方法は、

if (typeof name === "undefined") {
    // ...
}

もちろんgetName(undefined)、パラメーターが提供されている場合でも、呼び出し元は を呼び出して「だます」ことができますが、それにもかかわらず、チェックでは提供されていないというフラグが立てられます。しかし、それは本当に病的なシナリオです。

于 2012-10-03T19:08:23.123 に答える
0

はい、これはすべてのブラウザーで機能しますが、定義されているかどうかを確認したい場合は、次を使用できます。

function getName(name){
   name = typeof(name) !== "undefined" ? name : "default";
   return name;
}
于 2012-10-03T19:09:16.553 に答える