亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript sort() 排序的坑詳解

ispring / 1471人閱讀

摘要:前言做項(xiàng)目的時(shí)候發(fā)現(xiàn)使用排序后的代碼,在和平臺(tái)解析的結(jié)果不一樣。而根據(jù)規(guī)范,通過可以推測出,顯然這里互相矛盾反之亦然的情況。

前言:做項(xiàng)目的時(shí)候發(fā)現(xiàn)使用sort排序后的代碼,在android和ios平臺(tái)解析的結(jié)果不一樣。

1、先從簡單的開始,大家都知道sort()函數(shù)比較的是ASCII碼的大小,而且而且而且:Array的sort()方法默認(rèn)把所有元素先轉(zhuǎn)換為String再排序,所以就有以下問題。

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

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

結(jié)果轉(zhuǎn)換成字符串比較,"10"排在了"2"的前面,因?yàn)樽址?1"比字符"2"的ASCII碼小

2、使用回調(diào)函數(shù)的錯(cuò)誤

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

排序前后結(jié)果沒有變化

問題分析:
在sort實(shí)現(xiàn)的規(guī)范中有這么一條 sortFun(a,b) === 0,則有 a === b 且 b === a 。
此時(shí)我們再看var sortFun = (a, b) => a < b,它等同于var sortFun = (a, b) => a < b ? 1 : 0。

它有一個(gè)隱藏的漏洞:當(dāng)a >= b時(shí),sortFun(a,b) === 0。而根據(jù)規(guī)范,通過sortFun(a,b) === 0可以推測出a === b,顯然這里互相矛盾, 反之亦然(a > b的情況)。

所以比較的時(shí)候最好使用 a - b 或者 b - a

正確寫法:

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

android 和 ios平臺(tái)解析的sort函數(shù)實(shí)現(xiàn)方式不同,不規(guī)范的寫法可能導(dǎo)致解析結(jié)果不同

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/101458.html

相關(guān)文章

  • JavaScript中的Array.prototype.sort方法詳解

    摘要:方法可以接受一個(gè)可選的參數(shù),比較回調(diào)函數(shù)。方法會(huì)修改原本數(shù)組輸出如上,在調(diào)用方法后,自身數(shù)組被修改。對于長數(shù)組會(huì)使用快速排序,而快速排序一般是不穩(wěn)定的。所以方法返回的數(shù)組永遠(yuǎn)是該方法認(rèn)為的升序數(shù)組。 前幾天在某公司面試的時(shí)候被問到關(guān)于這個(gè)方法的默認(rèn)值的問題(然而面試官跟我說的其實(shí)是錯(cuò)的,當(dāng)場我還不夠底氣去反駁)。突然發(fā)現(xiàn)對這個(gè)方法的了解還不夠,因此回來查了資料,看了v8引擎的實(shí)現(xiàn)和EC...

    Snailclimb 評論0 收藏0
  • JS 中 Array.sort 的那些事兒

    摘要:然而有時(shí)候的結(jié)果和預(yù)期結(jié)果還是有些差異的。中文的可以通過來獲取。啊次比例中毓比侊啊比侊比例次毓中當(dāng)然和允許傳入?yún)?shù)指定,有興趣的可以去上看看用法。對于中文或者需要本地化比較的場景下,可以使用或者來進(jìn)行比較。 大家都知道 js 自帶了一個(gè)排序方法 sort,很多時(shí)候需要排序的時(shí)候也都直接使用了 sort 方法來排序。然而有時(shí)候 sort 的結(jié)果和預(yù)期結(jié)果還是有些差異的。 看下面的代碼 [...

    Sike 評論0 收藏0
  • JavaScript-原生Array對象方法詳解(一)

    摘要:元素是通過指定的分隔符進(jìn)行分隔的。注意該方法會(huì)改變原來的數(shù)組當(dāng)不帶參數(shù)調(diào)用時(shí),數(shù)組元素按照字母表排序必要時(shí)臨時(shí)轉(zhuǎn)換為字符串比較。方法用于刪除并返回?cái)?shù)組的最后一個(gè)元素。如果數(shù)組已經(jīng)為空,則不改變數(shù)組,并返回值。返回值的本地字符串表示。 1、join() join() 方法用于把數(shù)組中的所有元素轉(zhuǎn)換為一個(gè)字符串。元素是通過指定的分隔符進(jìn)行分隔的。arrayObject.join(separ...

    ls0609 評論0 收藏0
  • 【JS必知必會(huì)】高階函數(shù)詳解與實(shí)戰(zhàn)

    摘要:函數(shù)作為參數(shù)情況,,和是中內(nèi)置的高階函數(shù)。知道了到底啊什么是高階函數(shù),有哪些類型的高階函數(shù)。公眾號技術(shù)棧路線大家好,我是,公眾號程序員成長指北作者,這篇文章是必知必會(huì)系列的高階函數(shù)講解。 前言 一道經(jīng)典面試題: //JS實(shí)現(xiàn)一個(gè)無限累加的add函數(shù) add(1) //1 add(1)(2) //3 add(1)(2)(3) //6 當(dāng)大家看到這個(gè)面試題的時(shí)候,能否在第一時(shí)間想到...

    李昌杰 評論0 收藏0
  • 記數(shù)組sort方法與字符串比較引起的Bug

    摘要:發(fā)現(xiàn)的問題是字符串比較引起的。而在第二版的返回值是與,對應(yīng)的是和。字符串比較是一個(gè)一個(gè)字符進(jìn)行比較中方法的比較函數(shù)返回值正值,負(fù)值,的含義 前言 前幾天使用JavaScript中Array的sort排序字符串,發(fā)現(xiàn)排序不準(zhǔn)確,這里記一下。 第一版 var arr = [0, 1, 11, 11, 2, 12, 123, 123, 333, 5]; // 第一個(gè)版本 arr.sort(...

    wendux 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<