This article is in need of an editorial review.
This translation is incomplete. Please help translate this article from English.
これは 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) | ? | ? | ? |