ES2015のarrow functionsはargumentsを束縛しない

題の通りで、何かのES2015の紹介記事に書いてあった気がするんだが、いざコードを書く時にすっかり忘れていた。

() => {
  console.log(typeof arguments) // undefined
}

MDNの記事を読んだら( アロー関数 - JavaScript | MDN )、ES2015のrest parametersで代用できるよ、とのこと。

(...args) => {
  console.log(typeof args) // object
  console.log(Array.isArray(args)) // true
}

arguments、ライブラリを作っていて可変長引数をやりたい場合に使うのだけど、これが「Arrayのような」オブジェクトで push や pop といったメソッドが使えない。これを解決するためのイディオムとして、以下のように arguments を配列に変換するのだけど、知らない人が見たら、何だこれは、という気持ちになる。

var args = Array.prototype.slice.call(arguments);

一方、rest parameters の方は普通の配列なので「Arrayのような」オブジェクトかどうか気にしなくてもよい。ES2015の仕様が当たり前に使える世界になったら(そうなりつつあるが)、可変長引数の用途では arguments を使わず、rest parameters でいいのかもしれない。