【新機能】作り忘れたまとめはありませんか?31日前まで期間指定してまとめが作れる高度な検索ができました。有料APIだからツイートの漏れはありません!

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

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

ブックマークしたタグ

あなたの好きなタグをブックマークしておこう!話題のまとめを見逃さなくなります。
ログインして広告を非表示にする
ログインして広告を非表示にする