1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptの関数に引数が送られてこない場合の対処方法

2022-04-04 22:40:32

質問

JavaScriptの関数に引数が渡されたかどうかを判断する方法を2つ見てきました。1つの方法が他より優れているのか、それとも1つの方法を使うのが悪いのか、疑問に思っています。

 function Test(argument1, argument2) {
      if (Test.arguments.length == 1) argument2 = 'blah';

      alert(argument2);
 }

 Test('test');

または

 function Test(argument1, argument2) {
      argument2 = argument2 || 'blah';

      alert(argument2);
 }

 Test('test');

私が見る限り、どちらも同じ結果になりますが、私は以前、最初のものしか本番で使ったことがありません。

もう一つの選択肢は トム :

function Test(argument1, argument2) {
    if(argument2 === null) {
        argument2 = 'blah';
    }

    alert(argument2);
}

Juanのコメントのように、Tomの提案を変更するのがよいでしょう。

function Test(argument1, argument2) {
    if(argument2 === undefined) {
        argument2 = 'blah';
    }

    alert(argument2);
}

解決方法は?

関数に引数が渡されたかどうかを確認するには、いくつかの異なる方法があります。あなたの(元の)質問で言及された2つに加えて - チェックする arguments.length を使用するか、あるいは || 演算子でデフォルト値を指定することもできます。 undefined を経由して argument2 === undefined または typeof argument2 === 'undefined' というような妄想が膨らみます(コメント参照)。

を使用すると || 演算子は、クールな子供たちがみんなやっているような標準的な手法になっていますが、注意してください。デフォルト値は、引数が false ということは、実際には undefined , null , false , 0 , '' (または Boolean(...) を返します。 false ).

つまり、どのチェックをいつ使うかが問題なのですが、どれも微妙に結果が異なるので。

確認方法 arguments.length は「最も正しい」動作を示しますが、複数のオプション引数がある場合は実行不可能な場合があります。

のテストは undefined は次の「最善」の方法です。 undefined という値がありますが、これは引数を省略した場合と同じように扱われるはずです。

の使用は || 演算子は、有効な引数が与えられていても、デフォルト値を使用するようになるかもしれません。一方、その動作は実際に望ましいものであるかもしれません。

まとめると 自分が何をしているのか分かっている場合のみ使用するようにしましょう

個人的な意見ですが || また、オプションの引数が複数あり、名前付きパラメータの回避策としてオブジェクトリテラルを渡したくない場合にも、この方法を使用します。

もう1つ、デフォルト値を提供するために arguments.length は、switch文のラベルをフォールスルーすることで可能です。

function test(requiredArg, optionalArg1, optionalArg2, optionalArg3) {
    switch(arguments.length) {
        case 1: optionalArg1 = 'default1';
        case 2: optionalArg2 = 'default2';
        case 3: optionalArg3 = 'default3';
        case 4: break;
        default: throw new Error('illegal argument count')
    }
    // do stuff
}

この方法は、プログラマーの意図が(視覚的に)明らかでなく、「マジックナンバー」を使用するため、エラーが発生しやすいという欠点があります。