まとめの限定公開に「リンク限定」が追加されました。URLを伝えてまとめを共有しよう!

javascript:alert([].sort.call(null)) == [object window] の謎

JavaScript 難しい。 ECMAScript5の "use strict" 時の [].sort.call(null) の挙動に関する議論
JavaScript ecmascript5
4304view 3コメント
6
Atsushi Takayama @edvakf
javascript:alert([].sort.call(null)) これで window オブジェクト取れるのなんで?
てらまこ @teramako
【急募】 RT @edvakf: javascript:alert([].sort.call(null)) これで window オブジェクト取れるのなんで?
てらまこ @teramako
@edvakf むむむ、全然分からない。難しいですね。orz
Atsushi Takayama @edvakf
Worker の中でやったら [object DedicatedWorkerGlobalScope] となった。当然だけど。
kei-s @kei_s
. @edvakf @teramako ここの 15.3.4.4 じゃないでしょうか "thisArg が null または undefined の場合、呼出された関数は this 値としてグローバルオブジェクトを渡される" http://bit.ly/bMp9wI
Piro/Linuxコマンド操作漫画連載中 @piro_or
@kei_s @edvakf @teramako あと、ECMAScript仕様書の15.4.4.11では「sortのthisがArrayでない時の挙動は実装依存」ともありますね。その両方が組み合わさってこうなってる?
xulapp @xulapp
@edvakf call(null) は call(グローバル) と同じで、sort は this 値を返すことになっているのでそうなるんだと思います。
Atsushi Takayama @edvakf
@kei_s @piro_or @xulapp なーるほど。理解できました。実装依存となってるのは残念です… "use strict" だと global = (function(){return this})(); がエラーになるので。
Atsushi Takayama @edvakf
お、早速返事がもらえた。http://webreflection.blogspot.com/2010/02/jslint-bad-part.html#1641595776929548932 window が length プロパティを持ってるからとか。知らないw
Atsushi Takayama @edvakf
あ、でも call(null) でグローバルオブジェクトが入るのは "use strict" では消えるらしい…
javascripter @javascripter
@edvakf a.sort()がa自身を返すので、.sort.call(null)は.sort.call(window)と同じでwindowを返す。同様に[].concat.call(null)は[window]となる(a.concat()!=aなので配列以外は配列に包まれる)
kei-s @kei_s
@piro_or 理解できた!これを機に ECMAScript の仕様をサクっと引けるようにしておきます
Piro/Linuxコマンド操作漫画連載中 @piro_or
@edvakf 確かにテキトーなページで試してみるとlengthが0ですね。その後this(nullだったのがglobal objectになる)が返されて、結果としてwindowが返ってると。
Atsushi Takayama @edvakf
@javascripter http://j.mp/aVhIq2 によると、window.length があるために Array じゃないのに sort がエラーにならないそうです。おもしろいですね。
Atsushi Takayama @edvakf
ES5 の仕様読んでるけど "use strict" だと call(null) が使えないってどこに書いてあるのかわからない。
javascripter @javascripter
@edvakf o={};[].sort.call(o)==oでソートされない、http://j.mp/aXPsyl でwindowの0と1のtoStringを書き換えてからsortすると順序が変わるのでwindowはsortされてますね(window[0]はwritable)
javascripter @javascripter
@edvakf lengthの有無はエラーに関係なく、windowはarray-likeなのでlengthが0だと何も起きないが、sortの安定性は不定なのでframeのあるサイトで[].sort.call(null)するとwindow[0]とかが変更される可能性があります。
Atsushi Takayama @edvakf
javascript:alert( function(){return this}.call(null) ) がいいかも。
shogo ohta @os0x
@edvakf PDF119ページの冒頭のNOTEにあります。callでの挙動は、strict限定の話ではないみたい
Atsushi Takayama @edvakf
use strict じゃなくても call(null) は使えないって、ちょっと問題出そうな気がする…
Atsushi Takayama @edvakf
あれ、でもおかしい、別のところに、thisArg が null or undefined だったら global に置き換えろと書いてあったぞ。
shogo ohta @os0x
@edvakf こっちはエラーではなく、globalがundefinedになる、だと思います、たぶん
Atsushi Takayama @edvakf
@os0x 58ページの Else if thisArg is null or undefined, set the ThisBinding to the global object. とどう関わってくるのか気になるところです。
残りを読む(12)
ログインして広告を非表示にする