[bug] JS sort 函數在 ios 中無效

來源:互聯網
上載者:User

標籤:prot   替代   相容問題   hone   com   sort   存在   分享圖片   hit   

首先,請原諒我做一次標題黨;

但我覺得從發現問題到最後解決問題的過程還是蠻有意思的,特此記錄一下;

背景

近兩天開發的航班延誤寶是內嵌在用戶端(android、ios)webview 中的 H5 頁面。其中有部分內容需要前端排序後再顯示。代碼很簡單:

    let m = [6,4,8,10,3,5]    console.log(‘排序前:‘, [6,4,8,10,3,5])    m.sort((a, b) => a < b)    console.log(‘排序後:‘, m)

ps:發現這段代碼的問題了嗎?如果你知道原因,為了節省您寶貴的時間,後面內容就不要看啦;

在 PC 瀏覽器中列印的內容如下:

排序前: (6) [6, 4, 8, 10, 3, 5]排序後: (6) [10, 8, 6, 5, 4, 3]

但我用 iPhone 進行測試(只測了IOS瀏覽器、IOS航班管家用戶端),卻有不一樣的體驗:

WTF!結果和沒排序一樣,為甚?

解決

最開始推測可能是 sort 存在相容問題。於是,用插入排序替代sort進行測試,結果正常。

後來,在張(zhen)老(da)師(tui)的指導下,瞭解了sort的實現規範,才明白,原來是上面的實現有問題

哪裡有問題?

sort實現的規範中有這麼一條:若 comparefn (a,b) === 0,則有 a === b 且 b === a

此時我們再看var comparefn = (a, b) => a < b,它等同於var comparefn = (a, b) => a < b ? 1 : 0

它有一個隱藏的漏洞:當a >= b時,comparefn(a,b) === 0。而根據規範,通過comparefn(a,b) === 0可以推測出a === b,顯然這裡互相矛盾。

所以,我寫的這個comparefn原本就是錯誤的,holyshit!

那麼正確的寫法應該是:var comparefn = (a, b) => b - a

完結撒花;

再問:為什麼android和ios對此表現的不一樣呢?應該是兩家在具體實現上有所不同。

更多:

array.prototype.sort 實現規範

[bug] JS sort 函數在 ios 中無效

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.