簡體   English   中英

chrome環境和節點環境之間的“排序”方法有什么區別

[英]what's the 'sort' method's difference between chrome environment and node environment

我發現 sort 方法在 Chrome 環境和節點環境中顯示不同的行為

const arr = ['l', 'h', 'z', 'b', 's'];
arr.sort((pre, next) => {
    return pre < next;
});
console.log(arr);

節點環境的結果是[ 'z', 's', 'l', 'h', 'b' ] ,它已排序。
chrome 控制台環境的結果是['l', 'h', 'z', 'b', 's'] ,沒有任何改變。
chrome 的結果是我所期望的,我不明白為什么它在節點環境中工作。

鉻版本是74.0.3729.169 X64
節點 vsrions 是v10.12.0

V8 開發人員在這里。

正如一些評論所言,這與 Chrome 與 Node(它們的行為方式應該相同)無關。 這是由於 V8 版本的不同,Chrome 74 已經有了新的行為,而 Node 10 仍然有舊的行為。 更新到 Node 11,您會在那里看到相同的行為。

過去,V8 使用了 QuickSort(對於較大的數組)和 InsertionSort(對於小數組,最多 10 個元素)的組合。 InsertionSort 恰好與錯誤的比較器功能一起正常工作。 使用包含 11 個或更多元素的測試數組,它將不再在節點 10 中正確排序。

(自 7.4 以來的 V8 版本現在將 TimSort 用於Array.prototype.sort 。)


我知道這不是這個問題的內容,但為了記錄和/或將來閱讀此內容的任何其他人: (pre, next) => pre <= next不是一個好的比較器函數! 在 JavaScript 中, Array.prototype.sort期望一個比較器返回一個小於零、等於零或大於零的數字,具體取決於第一個參數是小於、等於還是大於第二個。 所以對字符串進行排序的正確方法是這樣的:

my_string_array.sort((a, b) => {
  if (a < b) return -1;
  if (a > b) return 1;
  return 0;
});

當您使用這樣的比較器時,您將始終獲得正確的結果,在所有版本的 Chrome 和 Node.js 中。

當您使用使用單個比較並因此返回布爾值的比較器時, true默默地映射到 1,而false映射到 0,但這意味着它意外地為一堆實際上不存在的對返回“相等”,相等,這會導致非常令人驚訝的排序結果,尤其是當引擎在引擎蓋下使用不穩定的排序算法時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM