JavaScript sort() 排序的坑詳解

前言:作項目的時候發現使用sort排序後的代碼,在android和ios平臺解析的結果不同。
clipboard.pngandroid

一、先從簡單的開始,你們都知道sort()函數比較的是ASCII碼的大小,並且並且並且:Array的sort()方法默認把全部元素先轉換爲String再排序,因此就有如下問題。ios

// baiDu排在了最後:
['Google', 'baiDu', 'Facebook'].sort(); // ['Facebook', 'Google", 'baiDu']

// 沒法理解的結果:
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]

結果轉換成字符串比較,'10'排在了'2'的前面,由於字符'1'比字符'2'的ASCII碼小函數

二、使用回調函數的錯誤spa

[10, 2, 3, 100, 6, 9].sort((a, b) => {
    return a < b;
});
// 沒法理解的結果
[10, 2, 3, 100, 6, 9]

排序先後結果沒有變化code

問題分析:
在sort實現的規範中有這麼一條 sortFun(a,b) === 0,則有 a === b 且 b === a 。
此時咱們再看var sortFun = (a, b) => a < b,它等同於var sortFun = (a, b) => a < b ? 1 : 0。blog

它有一個隱藏的漏洞:當a >= b時,sortFun(a,b) === 0。而根據規範,經過sortFun(a,b) === 0能夠推測出a === b,顯然這裏互相矛盾, 反之亦然(a > b的狀況)。排序

因此比較的時候最好使用 a - b 或者 b - aip

正確寫法:字符串

[10, 2, 3, 100, 6, 9].sort((a, b) => {
    return a - b;
});
// 結果
[2, 3, 6, 9, 10, 100]

android 和 ios平臺解析的sort函數實現方式不一樣,不規範的寫法可能致使解析結果不一樣回調函數

相關文章
相關標籤/搜索