前言:作項目的時候發現使用sort排序後的代碼,在android和ios平臺解析的結果不同。
android
一、先從簡單的開始,你們都知道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函數實現方式不一樣,不規範的寫法可能致使解析結果不一樣回調函數