JavaScriptの引数
元ネタ:Handling required parameters in ECMAScript 6
JavaScriptでは関数定義の引数の数と呼び出し時の引数の数が違っていても、エラーにならずに実行される。
function f(a, b) {
return [a, b];
}
f(); // => [undefined, undefined]
f(1); // => [1, undefined]
f(1, 2); // => [1, 2]
f(1, 2, 3); // => [1, 2]
引数が足りなければエラーにしたいことも多いんだけど、ES5までだと割りとごちゃごちゃした感じになっちゃう。そういう問題を、ES6で提案されているdefault parameterを使ってスッキリと解決するTipsが紹介されていた。
function throwError() {
throw Error();
}
function f(a = throwError()) {
return a;
}
f(1); // => 1
f(); // => エラー!
Pythonの似た機能だと関数の定義時に1回評価されるだけだからこういうことはできないけど、ES6のdefault parameterは引数が与えられなかった時だけ評価されるらしい。
コーヒー
元ネタのコメント欄で指摘されていたけど、CoffeeScriptでも同じことができる。
throwError = -> throw Error()
f = (a = throwError()) -> a
f 1 # => 1
f() # => エラー!
TypeScriptでもできるんじゃないか、と一瞬思ったけど、型チェックがある言語ではできても意味がないか。
Neat idea
元ネタのコメント欄で「Neat idea!」って言われていた。「neat」の意味は「きちんとした」とか「整理された」とか。
こういうところでこの単語を使うんだ、みたいなのを覚えておくといいんじゃないかと思う。から、ここにメモしておく。