2008-05-05

Array.prototype.sortの並び方が違う

未定義値やnull、空文字などを含んだ配列をArray.prototype.sortに0を返すソート関数を指定して並び替えた場合、ブラウザ毎に結果が違います。
["",void 0,null,NaN,0].sort(function(){
return 0;
});

上記コードで配列を並び替えた場合、各ブラウザの結果は次のようになります。
Firefox   [NaN,null,"",0,void 0]
IE, Opera, Rhino ["",null,NaN,0,void 0]
Safari [null,NaN,0,"",void 0]

これを見る限り0を返した後に独自の判断で並び替えるようです。個人的にどれも正しい結果と思えません。結果をみてもいまいち仕様がわかりませんし、ソート関数なしの場合とも結果が違うので困ります。
対応としてはソート関数を指定する場合は、値の型も見て慎重に並び替える必要がありそうです。また、型を見るだけではまだダメで、SafariとRhinoは0とNaNの比較で0を返すと[0,NaN]としますが、他のブラウザは[NaN,0]としてしまいます。ですのでNumber型はisNaN関数でNaNかどうかを判別して順序付けをする必要があるようです。

蛇足ですがソート関数なしで並び替える場合、結果は全て同じになるのでここは問題ないです。
["",0,NaN,null,void 0]


追記<17:05>
ECMAScriptの仕様にソート関数の結果が0の場合、順序が必ずしも安定していない事が明記されていました。順序がどうなるかはJavaScript実装によるようです。従って、結果を一定にするには自分達でしっかりしたソート関数を作る必要があります。

0 件のコメント: