Firefox4β の Array.concat.apply([], []) で例外

function flatten (array) { return Array.concat.apply([], array); } 続きを読む
4
テラマコ @teramako

Firefox4beta だと Array.prototype.concat.apply([],[]) は [] を返すが、Array.concat.apply([],[]) は例外が発生する...どういう事?

2010-09-17 22:39:03
Yuichirou Ogami @Yuichirou

@teramako 後者は前者と等価な形とするなら Array.concat([], []) か Array.concat.apply(null, [[], []]) では?

2010-09-17 22:41:48
テラマコ @teramako

@Yuichirou んー、この処理は ["a", ["b","c"],["d"],"e"] を ["a","b","c","d","e"] にする処理で、関数は function (ary){ return Array.concat.apply([], ary); } なんです

2010-09-17 22:46:56
xulapp @xulapp

Array.concat.apply([], ['a', ['b', 'c'], ['d'], 'e']).toSource() // [(new String("a")), "b", "c", "d", "e"]

2010-09-17 22:53:28
テラマコ @teramako

@xulapp 今さっき自分もやってたw

2010-09-17 22:54:05
Yuichirou Ogami @Yuichirou

@teramako いやいや、一般にgenericメソッドは Array.foo(array, arg1, arg2) とすると array.foo(arg1, arg2) と同様の操作をするものです。

2010-09-17 22:54:34
テラマコ @teramako

@Yuichirou concatメソッドに任意の数の引数を渡したいのです。なのでfunctionオブジェクトにapplyを使用したいんですけど...

2010-09-17 22:58:16
think49 @think49

@teramako 関係あるかわかりませんが、Google Chrome 6 で Array.concat.apply([],[]) を実行すると「TypeError: Cannot call method 'apply' of undefined」のエラーが返ってきました。

2010-09-17 23:01:35
Yuichirou Ogami @Yuichirou

@teramako あー、わかりました。それなら Array.concat.apply(null, [[]].concat(ary)) とすれば良いと思います。

2010-09-17 23:02:26
think49 @think49

@teramako Google Chrome 6 の場合は Array.concat が未定義のようです。[].concat.apply([],[]) なら通りました。(Array.prototype.concat からメソッドが継承されます)

2010-09-17 23:02:34
テラマコ @teramako

@think49 はい、Chromeだとエラーだと思います。Mozilla JavaScript オンリーな話なんです...

2010-09-17 23:03:19
Yuichirou Ogami @Yuichirou

@teramako あるいは Array.prototype.concat.apply([], ary) の方が直感的かもしれません。

2010-09-17 23:09:07
think49 @think49

@teramako 失礼しました。Fx v3.6.6 なら Array.concat.apply([],[]) で [] が返りますね。Array.concat === Array.prototype.concat が false を返すので完全に等価ではないようですが…。

2010-09-17 23:09:29
think49 @think49

Array.concat.apply([], [[]]) なアプローチは私も考えましたが、ES3仕様では引数なしでもパスするはずなんですよね…。

2010-09-17 23:13:38
xulapp @xulapp

ほんとだ、ジェネリックメソッドの第一引数に null 受け付けなくなってる。Mozilla JS ちゅっちゅ

2010-09-17 23:15:28
think49 @think49

[].concat() はパスするはず。( http://bit.ly/coSGAK ) [].concat([]) の方が良い実装だとは思いますが…。 #JavaScript

2010-09-17 23:16:35
テラマコ @teramako

@Yuichirou ですね。因みにFirefox4betaになってから例外が発生する理由って分かるでしょうか?

2010-09-17 23:19:32
Yuichirou Ogami @Yuichirou

@teramako Fx4betaは試していませんが、Array.concat(foo, bar) は Array.concat.apply(Array, [foo, bar]) と等価なので、Array.concatの中でthisをArrayだとして参照してるのかもしれません。

2010-09-17 23:26:01
Yuichirou Ogami @Yuichirou

@teramako 今気づきました。Array.concat.apply([], []) はつまり Array.concat() ……第1引数必須のgenericメソッドを無引数で呼んだら例外が飛ぶのは自然です!

2010-09-17 23:43:52
テラマコ @teramako

@Yuichirou 今までがダメだったわけで、そのバグが修正されたから例外が出るようになったということでしょうか。

2010-09-17 23:45:24
Yuichirou Ogami @Yuichirou

@teramako はい。これまで(Fx3.6)はapplyの第1引数に基づいてなんかよくわからないことをしています。

2010-09-17 23:55:14
テラマコ @teramako

@Yuichirou 了解です。いろいろ教えていただきありがとうございました。

2010-09-17 23:56:32
Yuichirou Ogami @Yuichirou

. @potappo 先生キタ! これで勝つる!!(ととりあえず言ってみる)

2010-09-18 00:00:34