1 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
V8 開(kāi)發(fā)人員在這里。
正如一些評(píng)論所言,這與 Chrome 與 Node(它們的行為方式應(yīng)該相同)無(wú)關(guān)。這是由于 V8 版本的不同,Chrome 74 已經(jīng)有了新的行為,而 Node 10 仍然有舊的行為。更新到 Node 11,您會(huì)在那里看到相同的行為。
過(guò)去,V8 使用了 QuickSort(對(duì)于較大的數(shù)組)和 InsertionSort(對(duì)于小數(shù)組,最多 10 個(gè)元素)的組合。InsertionSort 恰好與錯(cuò)誤的比較器功能一起正常工作。使用包含 11 個(gè)或更多元素的測(cè)試數(shù)組,它將不再在節(jié)點(diǎn) 10 中正確排序。
(自 7.4 以來(lái)的 V8 版本現(xiàn)在使用 TimSort Array.prototype.sort。)
我知道這不是這個(gè)問(wèn)題的內(nèi)容,但為了記錄和/或?qū)?lái)閱讀此內(nèi)容的任何人:(pre, next) => pre <= next這不是一個(gè)好的比較器功能!在 JavaScript 中,Array.prototype.sort根據(jù)第一個(gè)參數(shù)是小于、等于還是大于第二個(gè)參數(shù),期望比較器返回小于零、等于零或大于零的數(shù)字。所以對(duì)字符串進(jìn)行排序的正確方法是這樣的:
my_string_array.sort((a, b) => {
if (a < b) return -1;
if (a > b) return 1;
return 0;
});
當(dāng)您使用這樣的比較器時(shí),您將始終獲得正確的結(jié)果,在所有版本的 Chrome 和 Node.js 中。
當(dāng)你使用一個(gè)比較器,它使用單個(gè)比較并因此返回一個(gè)布爾值,然后true默默地映射到 1 并false映射到 0,但這意味著它意外地為一堆實(shí)際上不相等的對(duì)返回“相等”,這可能會(huì)導(dǎo)致非常令人驚訝的排序結(jié)果,尤其是當(dāng)引擎在引擎蓋下使用不穩(wěn)定的排序算法時(shí)。
添加回答
舉報(bào)