この記事は編集レビューを必要としています。ぜひご協力ください。
この翻訳は不完全です。英語から この記事を翻訳 してください。
これは Harmony(ECMAScript 6) 提案の一部であり、実験段階の技術です。
この技術の仕様は安定していません。ブラウザ互換性の一覧表を確認してください。またこれらの構文や動作は、仕様変更などにより、新しいバージョンのブラウザでは変更される可能性があるという点に注意してください。
構文
function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) { statements }
説明
JavaScriptでは、 関数の引数は、undefined
がデフォルトとなります。しかし、場合によっては違ったデフォルト値を設定したいと思うことがあるかもしれません。そのような場合、デフォルト引数が使用できます。
以前は、デフォルト値を設定するための一般的な方法は、関数の本体でパラメータ値をテストし、undefined
の場合、値を代入することでした。次の例では、呼び出しにおいてb
に対して値が提供されない場合、a*b
を評価すると、その値はundefined
になり、multiple
の呼び出しはNaN
を返します。しかしながら、この例では、これは、二行目でキャッチされます。:
function multiply(a, b) { b = typeof b !== 'undefined' ? b : 1; return a*b; } multiply(5); // 5
デフォルトパラメータを用いると、関数本体内のチェックはもはや必要ありません。関数の先頭でb
に対してデフォルト値として1
を単に設定するだけです。:
function multiply(a, b = 1) { return a*b; } multiply(5); // 5
例
undefined
を渡す
この例の2番目の呼び出しで、たとえ第二引数が呼び出し時に明示的にundefined
が設定されても、color
引数の値はデフォルト値になります。
function setBackgroundColor(element, color = 'rosybrown') { element.style.backgroundColor = color; } setBackgroundColor(someDiv); // color は 'rosybrown'になります setBackgroundColor(someDiv, undefined); // color は 'rosybrown'になります setBackgroundColor(someDiv, 'blue'); // color は 'blue' になります
呼び出し時の評価
デフォルト引数は呼び出し時に評価されます。なので、例えば、Pythonと違い、新しいオブジェクトは、関数が呼ばれるたびに生成されます。
function append(value, array = []) { array.push(value); return array; } append(1); //[1] append(2); //[2], not [1, 2]
下記であっても関数と変数に適用されます。:
function callSomething(thing = something()) { return thing } callSomething(); //throws a ReferenceError let (something = () => "sth") { callSomething(); //"sth" }
デフォルトのパラメータは、その後ろのデフォルトパラメータで再使用可能
すでに出現した引数は、その後ろのデフォルト引数でも使用可能です。:
function singularAutoPlural(singular, plural = singular+"s", rallyingCry = plural + " ATTACK!!!") { return [singular, plural, rallyingCry ]; } //["Gecko","Geckos", "Geckos ATTACK!!!"] singularAutoPlural("Gecko"); //["Fox","Foxes", "Foxes ATTACK!!!"] singularAutoPlural("Fox","Foxes"); //["Deer", "Deer", "Deer ... change."] singularAutoPlural("Deer", "Deer", "Deer peaceably and respectfully petition the government for positive change.")
この機能は、単純な方法で近似し、どのように多くのエッジケースが処理されるかを示しています。
function go() { return ":P" } function withDefaults(a, b = 5, c = b, d = go(), e = this, f = arguments, g = this.value) { return [a,b,c,d,e,f,g]; } function withoutDefaults(a, b, c, d, e, f, g){ switch(arguments.length){ case 0: a case 1: b = 5 case 2: c = b case 3: d = go(); case 4: e = this case 5: f = arguments case 6: g = this.value; default: } return [a,b,c,d,e,f,g]; } withDefaults.call({value:"=^_^="}); // [undefined, 5, 5, ":P", window, arguments, "=^_^="] withoutDefaults.call({value:"=^_^="}); // [undefined, 5, 5, ":P", window, arguments, "=^_^="]
関数本体の内部で定義された関数
Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30)で導入されました。関数本体内で宣言された関数はデフォルトパラメータの内部に参照することができず、ReferenceError
をスローします(現在、SpiderMonkeyではTypeError
です。バグ 1022967をご覧ください)。デフォルトパラメータは常に最初に実行され、関数本体内の関数宣言は、その後評価します。
// Doesn't work! Throws ReferenceError. function f(a = go()) { function go(){return ":P"} }
デフォルトパラメータの後ろにデフォルトを指定しないパラメータが存在する場合
Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2)以前では、次のコードではSyntaxError
の結果になります。これはバグ 777060で修正され、最新のバージョンで期待されたとおりに動作します。:
function f(x=1, y) { return [x, y]; } f(); // [1, undefined]
構造化代入パラメータのデフォルトパラメータ
Gecko 41 (Firefox 41 / Thunderbird 41 / SeaMonkey 2.38)以前では、次のコードでは、SyntaxError
の結果になります。これはバグ 1018628で修正され最新のバージョンでは期待されたとおり動作します。:
function f([x, y] = [1, 2], {z: z} = {z: 3}) { return x + y + z; } f(); // 6
仕様
仕様 | ステータス | コメント |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Function Definitions' in that specification. |
Standard | 初期定義。 |
ブラウザ実装状況
機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本サポート | 未サポート | 15.0 (15.0) | 未サポート | 未サポート | 未サポート |
デフォルトパラメータ後のデフォルトないのパラメータ | ? | 26.0 (26.0) | ? | ? | ? |
構造化代入パラメータのデフォルトパラメータ | ? | 41.0 (41.0) | ? | ? | ? |
機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
基本サポート | (有) | (有) | 15.0 (15.0) | 未サポート | 未サポート | 未サポート |
デフォルトパラメータ後のデフォルトないのパラメータ | ? | ? | 26.0 (26.0) | ? | ? | ? |
構造化代入パラメータのデフォルトパラメータ | ? | ? | 41.0 (41.0) | ? | ? | ? |