JavaScript sort() 排序的坑詳解
前言:做專案的時候發現使用sort排序後的程式碼,在android和ios平臺解析的結果不一樣。
1、先從簡單的開始,大家都知道sort()函式比較的是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) => a < b,它等同於var sortFun = (a, b) => a < b ? 1 : 0。
它有一個隱藏的漏洞:當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]