为了账号安全,请及时绑定邮箱和手机立即绑定

chrome环境和节点环境之间的“排序”方法有什么区别

chrome环境和节点环境之间的“排序”方法有什么区别

开满天机 2021-06-09 13:05:46
我发现 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 的结果是我所期望的,我不明白为什么它在节点环境中工作。chrome 版本是74.0.3729.169 X64node vsrions 是v10.12.0.
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

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,但这意味着它意外地为一堆实际上不相等的对返回“相等”,这可能会导致非常令人惊讶的排序结果,尤其是当引擎在引擎盖下使用不稳定的排序算法时。


查看完整回答
反对 回复 2021-06-11
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信