Firefox4β の Array.concat.apply([], []) で例外
![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
Firefox4beta だと Array.prototype.concat.apply([],[]) は [] を返すが、Array.concat.apply([],[]) は例外が発生する...どういう事?
2010-09-17 22:39:03![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako 後者は前者と等価な形とするなら Array.concat([], []) か Array.concat.apply(null, [[], []]) では?
2010-09-17 22:41:48![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@Yuichirou んー、この処理は ["a", ["b","c"],["d"],"e"] を ["a","b","c","d","e"] にする処理で、関数は function (ary){ return Array.concat.apply([], ary); } なんです
2010-09-17 22:46:56![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
Array.concat.apply([], ['a', ['b', 'c'], ['d'], 'e']).toSource() // [(new String("a")), "b", "c", "d", "e"]
2010-09-17 22:53:28![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako いやいや、一般にgenericメソッドは Array.foo(array, arg1, arg2) とすると array.foo(arg1, arg2) と同様の操作をするものです。
2010-09-17 22:54:34![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@Yuichirou concatメソッドに任意の数の引数を渡したいのです。なのでfunctionオブジェクトにapplyを使用したいんですけど...
2010-09-17 22:58:16![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako 関係あるかわかりませんが、Google Chrome 6 で Array.concat.apply([],[]) を実行すると「TypeError: Cannot call method 'apply' of undefined」のエラーが返ってきました。
2010-09-17 23:01:35![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako あー、わかりました。それなら Array.concat.apply(null, [[]].concat(ary)) とすれば良いと思います。
2010-09-17 23:02:26![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako Google Chrome 6 の場合は Array.concat が未定義のようです。[].concat.apply([],[]) なら通りました。(Array.prototype.concat からメソッドが継承されます)
2010-09-17 23:02:34![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako あるいは Array.prototype.concat.apply([], ary) の方が直感的かもしれません。
2010-09-17 23:09:07![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako 失礼しました。Fx v3.6.6 なら Array.concat.apply([],[]) で [] が返りますね。Array.concat === Array.prototype.concat が false を返すので完全に等価ではないようですが…。
2010-09-17 23:09:29![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
Array.concat.apply([], [[]]) なアプローチは私も考えましたが、ES3仕様では引数なしでもパスするはずなんですよね…。
2010-09-17 23:13:38![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
[].concat() はパスするはず。( http://bit.ly/coSGAK ) [].concat([]) の方が良い実装だとは思いますが…。 #JavaScript
2010-09-17 23:16:35![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako Fx4betaは試していませんが、Array.concat(foo, bar) は Array.concat.apply(Array, [foo, bar]) と等価なので、Array.concatの中でthisをArrayだとして参照してるのかもしれません。
2010-09-17 23:26:01![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako 今気づきました。Array.concat.apply([], []) はつまり Array.concat() ……第1引数必須のgenericメソッドを無引数で呼んだら例外が飛ぶのは自然です!
2010-09-17 23:43:52![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@teramako はい。これまで(Fx3.6)はapplyの第1引数に基づいてなんかよくわからないことをしています。
2010-09-17 23:55:14