2008-09-17

Google ChromeのJavaScriptで見つけた振る舞いの違い

Google製のブラウザがでたので自前のJavaScript実装テストを流してみたところ、Array#lastIndexの振る舞いが他のブラウザと違うのことを見つけたので、レアケースで役に立たないネタですがメモとして書いておきます。

一つ目はlastIndexで、第二引数にnullやundefined、NaN、{}を指定するとChrome、Safari or Air、その他の間で振る舞いが異なります。次のコードを実行すると
var array = [1, "0", NaN, 1];
array.lastIndexOf(1, null);
array.lastIndexOf(1, void 0)
array.lastIndexOf(1, NaN)
array.lastIndexOf(1, {})

各ブラウザで以下の結果になります。
//Chrome
3
3
0
0

//Safari or Air
0
3
3
3

//その他
0
0
0
0
nullやundefinedを指定した時の始点が違うようで、0と3がばらばらな結果になります。ChromeはWebKitベースなのでJavaScriptエンジンもSafariと同じJavaScriptCoreだと思ったのですが、V8という独自のエンジンを積んでいるそうで、この振る舞いはそこが原因のようです。

二つ目はArray#sortメソッドの振る舞いで、以前実施したテスト(ここここ)をChromeでも実施してみたところ、今までにないユニークな結果を返しました。結果がいい感じにバラバラですがFirefoxは3が振る舞いをIEに合わせるなど徐々に統一されているようです。
["",void 0,null,NaN,0]    //並び替え前

[NaN,"",0,null,void 0] //Chrome
[null,void 0,NaN,"",0] //Dreamweaver, Netscape7
[void 0,null,NaN,0,""] //NN4
["",void 0,null,NaN,0] //Mozilla
[NaN,null,"",0,void 0] //Firefox
["",null,NaN,0,void 0] //IE, Opera, Rhino, Firefox3
[null,NaN,0,"",void 0] //Safari, AIR

追記:
lastIndexについて以前同じようなこと記事で書いたことを忘れていました。lastIndexで振る舞いが異なるのは仕様書が曖昧なのが原因のように感じます。テストコード付きの仕様書があると説得力あるのだけどどこかにあるのかなぁ。

0 件のコメント: