Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2016年9月以降、すべてのブラウザーで利用可能です。
関数のデフォルト引数は、値が渡されなかった場合や undefined が渡された場合に、名前付き引数を既定値で初期化するためのものです。
JavaScript では、関数の引数は、指定しなければ undefined になります。しかし、別な既定値を設定すると有用な場合がよくあります。そのような場合に、デフォルト引数が役立ちます。
次の例では、b の値を指定せずに multiply を呼び出した場合、a * b を評価するときに b の値が undefined となり、multiply は NaN を返します。
以前は、既定値を設定する一般的な手法として、関数本体内で引数の値を検査し、 undefined の場合に値を代入する方法が用いられていました。次の例では、 multiply が引数 1 つだけで呼び出された場合、 b は 1 に設定されます。
デフォルト引数を用いると、関数本体内のチェックが必要なくなります。関数の先頭で 1 を b の既定値として設定するだけです。
引数は左から右の順序で設定され、既定値のない後続の引数が存在した場合でも、既定値を上書きします。
メモ: 最初のデフォルト引数と、後に続くすべての引数は、関数のlengthには影響しません。
デフォルト引数の初期化子は、関数本体用に作成されるスコープの親となる、独自のスコープ内に存在します。
これは、後続の引数の初期化子において、先行する引数を参照できるということです。ただし、関数本体で宣言された関数や変数は、デフォルト引数の初期化子から参照することはできません。これを試みると、実行時に ReferenceError が発生します。これには関数本体で var 宣言された変数も含まれます。
例えば、次の関数は呼び出されると ReferenceError が発生します。デフォルト引数の値が、関数本体の子スコープの変数にアクセス権を持たないためです。
この関数は引数の a の値を出力します。変数 var a は関数本体用に作成されたスコープの先頭までしか巻き上げられず、引数リスト用に作成された親スコープまで巻き上げられないため、 b からはその値が見えないからです。
デフォルト引数は任意の式が使用できますが、デフォルト式の評価を一時停止させる await や yield は使用できません。引数は同期的に初期化しなければなりません。
メモ: デフォルト引数は関数が定義された時ではなく呼び出された時に評価されるため、await および yield 演算子の有効性は、その関数自体に依存し、周囲の関数には依存しません。例えば、現在の関数が async でない場合、await は識別子として構文解析され、通常の 識別子の構文規則 に従います。これは、この関数が async 関数内に入れ子である場合でも同様です。
この例の 2 番目の呼び出しでは、第 1 引数で明示的に (null やその他の偽値ではなく) undefined を設定していても、num 引数の値は既定値のままになります。
デフォルト引数は呼び出し時に評価されるので、(例えば) Python とは異なり、関数が呼び出される度に新しいオブジェクトが生成されます。
これは、関数と変数にも適用されます。
前に (左側で) 定義された引数は、その後のデフォルト引数で利用することができます。
この機能はこの、いくつもの極端な例を扱うデモに近いかもしれません。
既定値の代入を、構造分解構文で行うことができます。
これを行う一般的な方法は、空のオブジェクト/配列をオブジェクト/配列に構造分解することです。例えば、 [x = 1, y = 2] = [] とします。 このようにすることで、空の配列/オブジェクトを関数に渡しても、あらかじめ設定した値を保持することができます。
| ECMAScript® 2027 Language Specification # sec-function-definitions |
ブラウザー互換性一覧表を表示するには、JavaScript を有効にしてください。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。