◆ apply 地獄からの解放?

Node.js で使えるという記事をみつけて そろそろ Chrome も使えないかなー とためしてみると動きました
Chrome 45 では使えなかったので Chrome 46 からです

spread operator ってこういうものです

> [[1,2]]
< [Array[2]]

> [1,2, ...[3,4,5], 6,7,8]
< [1, 2, 3, 4, 5, 6, 7, 8]

> [...[1,2]]
< [1, 2]
配列を埋め込めます
function printArgs(a,b,c){
console.log(arguments)
console.log(a,b,c)
}
printArgs(0,...[1,2,3],4)
[0, 1, 2, 3, 4]
0 1 2
引数の展開もできます


わぁ 便利!!!

こう書いても どこに使えるか 想像つきにくいかもしれないですが 可変引数を扱うときに apply をする手間が減ります
作るものによっては 可変引数なんかめったに触れないかもしれないですけど 私の場合よく使うのでかなーり嬉しいです

applyなんていらない

今まで
function fn1(){
console.log("applyする")
fn2.apply(null, arguments)
}
function fn2(a,b,c){
console.log(a,b,c)
}
fn1(100,200,300)
applyする
100 200 300
だったのを
function fn1(){
console.log("applyしない")
fn2(...arguments)
}
function fn2(a,b,c){
console.log(a,b,c)
}
fn1(100,200,300)
applyしない
100 200 300
で済みます

...」 という書き方が見やすいかと言われれば 「あんまり」 ですけど apply 書くよりは楽になって見やすいです

これで apply this を指定したいときだけで済みます
第一引数に null とか window を書く apply を消せます

arguments は特別らしい

ところで
ただのオブジェクトのはずの arguments に使えるなら 他のオブジェクトでもいけそうです

ですが できなかったです
var pseudo_array = {0:1,1:2,2:3,length:3}
console.log([...pseudo_array])
エラーになります

Chrome では length と splice あれば表示が配列になるとありましたけど splice を入れてみても ダメでした

実は配列以外でも

他にも 文字列に使うことで
> [..."abc"]
< ["a", "b", "c"]
こうできます
split メソッドで分割しなくても 一文字ずつの配列にできます

さすがに 数字などではエラーになります
> [...1]
< Uncaught TypeError: undefined is not a function(…)

> [...true]
< Uncaught TypeError: undefined is not a function(…)
ただ 今のところエラーになる数字などの型が来た時に出るエラーがよくわからないです
このエラーメッセージで原因がわかるひとはそういないですよね

undefined が関数じゃない」と言われても なんのこと? としか思えません
エラーになったら行数が書いてるはずなので このエラーメッセージを見たらその行の 「...」 が原因かもしれないと覚えておけばいいかと思います


Chrome ダメだなーと思ってるかもしれないですが Firefox でも
TypeError: true[Symbol.iterator] is not a function
なので分かりやすいとはいえないです
true と書いてくれてるだけ Chrome よりはマシですけど

... って他にもどこかで

まだ Chrome だと使えませんけど 引数受け取りでも 「...」 があるんですよね
Firefox でやってみます
function fn(head, ...tail){
console.log("1つめ", head)
console.log("2つめ以降", tail)
}
fn(1,2,3,4,5)
1つめ 1
2つめ以降 Array [ 2, 3, 4, 5 ]
こっちだと ...がしっくり来ますね
他の言語でもこんな引数の受け取り方があったようななかったような……


今後 JavaScript コードで ... をよくみるようになりそうです
基本的なシンタックスが増えると 書きやすい反面 覚えるのがたいへんなのと 新しく言語覚える人がかなり苦労しそうです
JavaScript も複雑な言語になっていくんですかねー