[解決済み】JavaScriptの関数に引数が送られてこない場合の対処方法
質問
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
}
この方法は、プログラマーの意図が(視覚的に)明らかでなく、「マジックナンバー」を使用するため、エラーが発生しやすいという欠点があります。
関連
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み] jQueryで、ユーザーがそのフィールドを編集している間、テキストフィールドの最初の文字を大文字にするにはどうすればよいですか?
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】Google Conversionsが動作しない - スクリプトが読み込まれない
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み] エラー。モジュールhtmlが見つからない
-
[解決済み】React.jsの配列の子要素のユニークキーを理解する
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】リソースはドキュメントと解釈されるが、MIMEタイプはapplication/zipで転送される
-
[解決済み] Uncaught (in promise) TypeError: フェッチに失敗してCorsエラー
-
[解決済み】中央値の計算 - javascript
-
[解決済み] 数字を通貨文字列としてフォーマットする方法