javascript - 'sort'方法在chrome环境和node环境有什么区别

标签 javascript node.js v8

我发现排序方法在 Chrome 环境和 Node 环境中表现出不同的行为

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

Node 环境的结果为[ 'z', 's', 'l', 'h', 'b' ],已排序。
Chrome 控制台环境的结果是 ['l', 'h', 'z', 'b', 's'],没有任何变化。
chrome的结果是我所期望的,我不明白为什么它在node环境中工作。

chrome 版本为 74.0.3729.169 X64
Node vsrions 是 v10.12.0

最佳答案

这里是 V8 开发人员。

正如一些评论所说,这不是 Chrome 与 Node 的问题(它们的行为方式应该相同)。这是由于 V8 版本的差异所致,Chrome 74 已经具有新行为,而 Node 10 仍然具有旧行为。更新到 Node 11,您将看到相同的行为。

过去,V8 使用快速排序(针对较大数组)和插入排序(针对小型数组,最多 10 个元素)的组合。插入排序恰好可以在不好的比较器函数的情况下正常工作。使用包含 11 个或更多元素的测试数组,它在 Node 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 中,您始终会获得正确的结果。

当您使用使用单个比较并因此返回 bool 值的比较器时,则 true默默地映射到 1 和 false映射到 0,但这意味着它会意外地为一堆实际上不相等的对返回“相等”,这可能会导致非常令人惊讶的排序结果,特别是当引擎在后台使用不稳定的排序算法时。

关于javascript - 'sort'方法在chrome环境和node环境有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56320307/

相关文章:

java - 如何从 Controller 以可接受的格式向 Highstock 发送数据?

javascript - 在 &lt;input&gt; 或 &lt;textarea&gt; 上右键单击删除的 IE 事件

javascript - 从外部跨度获取文本,而不获取内部元素的文本

javascript - 如何在 Angular 7 中使用 JavaScript 代码?

javascript - Mapnik 无法确定图像类型

v8 - std::string 到 v8::string 的转换

node.js - 在 Ubuntu 中安装没有 sudo 的 NodeJS

javascript - 使用 fs [node js] 将文本从文本文件转换为数组

javascript - 各种Javascript优化项目如何影响DOM性能?

c++ - 为什么它在这里使用 void** ?