繁体   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