JavaScript sort()並べ替えの穴の詳細
1173 ワード
前書き:プロジェクトをする時にソトを使って並べ替えたコードを発見しました.androidとiosプラットフォームで解析した結果は違っています.
1、まず簡単なものから始めて、ソト()関数の比較はASCIIコードの大きさであることをみんな知っています.そして、ARrayのsort()方法はデフォルトではすべての元素をStringに変えて並べ替えます.だから、以下の問題があります.
2、コールバック関数を使用したエラー
問題の分析:sortで実現される規範には、このsortFun(a,b)==0があり、a==b=b=aがあります.この時私達はまたvar sortFun=(a,b)=>aaそれは隠し穴があります.a>=bの場合、sortFun(a,b)==0です.規格によっては、sortFun(a,b)==0でa==bと推定され、ここでは明らかに矛盾しています.逆も(a>bの場合)です.
だから比較する時はa-bあるいはb-aを使うほうがいいです.
正しい書き方:
1、まず簡単なものから始めて、ソト()関数の比較はASCIIコードの大きさであることをみんな知っています.そして、ARrayのsort()方法はデフォルトではすべての元素をStringに変えて並べ替えます.だから、以下の問題があります.
// baiDu :
['Google', 'baiDu', 'Facebook'].sort(); // ['Facebook', 'Google", 'baiDu']
// :
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]
文字列比較に変換します.'10'は'2'の前に並んでいます.文字'1'は文字'2'のASCIIコードより小さいです.2、コールバック関数を使用したエラー
[10, 2, 3, 100, 6, 9].sort((a, b) => {
return a < b;
});
//
[10, 2, 3, 100, 6, 9]
ソート前後の結果は変わりません.問題の分析:sortで実現される規範には、このsortFun(a,b)==0があり、a==b=b=aがあります.この時私達はまたvar sortFun=(a,b)=>aaそれは隠し穴があります.a>=bの場合、sortFun(a,b)==0です.規格によっては、sortFun(a,b)==0でa==bと推定され、ここでは明らかに矛盾しています.逆も(a>bの場合)です.
だから比較する時はa-bあるいはb-aを使うほうがいいです.
正しい書き方:
[10, 2, 3, 100, 6, 9].sort((a, b) => {
return a - b;
});
//
[2, 3, 6, 9, 10, 100]
Androidとiosプラットフォームの解析のsort関数の実現方式は違っています.規範でない書き方は解析結果が違ってくるかもしれません.