ひよこ3:07のTechブログ

ES6の新機能で引数を必須にする

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」の意味は「きちんとした」とか「整理された」とか。

こういうところでこの単語を使うんだ、みたいなのを覚えておくといいんじゃないかと思う。から、ここにメモしておく。