javascript:alert([].sort.call(null)) == [object window] の謎
javascript:alert([].sort.call(null)) これで window オブジェクト取れるのなんで?
2010-02-17 15:14:52【急募】 RT @edvakf: javascript:alert([].sort.call(null)) これで window オブジェクト取れるのなんで?
2010-02-17 15:17:59@teramako 元ネタはここです。http://webreflection.blogspot.com/2010/02/jslint-bad-part.html
2010-02-17 15:19:32Worker の中でやったら [object DedicatedWorkerGlobalScope] となった。当然だけど。
2010-02-17 15:27:48. @edvakf @teramako ここの 15.3.4.4 じゃないでしょうか "thisArg が null または undefined の場合、呼出された関数は this 値としてグローバルオブジェクトを渡される" http://bit.ly/bMp9wI
2010-02-17 15:34:41@kei_s @edvakf @teramako あと、ECMAScript仕様書の15.4.4.11では「sortのthisがArrayでない時の挙動は実装依存」ともありますね。その両方が組み合わさってこうなってる?
2010-02-17 15:39:30@edvakf call(null) は call(グローバル) と同じで、sort は this 値を返すことになっているのでそうなるんだと思います。
2010-02-17 15:41:30@kei_s @piro_or @xulapp なーるほど。理解できました。実装依存となってるのは残念です… "use strict" だと global = (function(){return this})(); がエラーになるので。
2010-02-17 15:45:04お、早速返事がもらえた。http://webreflection.blogspot.com/2010/02/jslint-bad-part.html#1641595776929548932 window が length プロパティを持ってるからとか。知らないw
2010-02-17 15:47:18あ、でも call(null) でグローバルオブジェクトが入るのは "use strict" では消えるらしい…
2010-02-17 15:48:03@edvakf a.sort()がa自身を返すので、.sort.call(null)は.sort.call(window)と同じでwindowを返す。同様に[].concat.call(null)は[window]となる(a.concat()!=aなので配列以外は配列に包まれる)
2010-02-17 15:50:28@edvakf 確かにテキトーなページで試してみるとlengthが0ですね。その後this(nullだったのがglobal objectになる)が返されて、結果としてwindowが返ってると。
2010-02-17 15:55:20@javascripter http://j.mp/aVhIq2 によると、window.length があるために Array じゃないのに sort がエラーにならないそうです。おもしろいですね。
2010-02-17 15:59:29window.length はフレームの数。https://developer.mozilla.org/ja/DOM/window.length へー。
2010-02-17 16:00:27ES5 の仕様読んでるけど "use strict" だと call(null) が使えないってどこに書いてあるのかわからない。
2010-02-17 16:05:37@edvakf o={};[].sort.call(o)==oでソートされない、http://j.mp/aXPsyl でwindowの0と1のtoStringを書き換えてからsortすると順序が変わるのでwindowはsortされてますね(window[0]はwritable)
2010-02-17 16:14:26@edvakf lengthの有無はエラーに関係なく、windowはarray-likeなのでlengthが0だと何も起きないが、sortの安定性は不定なのでframeのあるサイトで[].sort.call(null)するとwindow[0]とかが変更される可能性があります。
2010-02-17 16:21:37javascript:alert( function(){return this}.call(null) ) がいいかも。
2010-02-17 16:25:01あれ、でもおかしい、別のところに、thisArg が null or undefined だったら global に置き換えろと書いてあったぞ。
2010-02-17 16:37:08@os0x 58ページの Else if thisArg is null or undefined, set the ThisBinding to the global object. とどう関わってくるのか気になるところです。
2010-02-17 16:38:14