【问题标题】:Why Array.prototype.sort has different behavior in Chrome? [duplicate]为什么 Array.prototype.sort 在 Chrome 中有不同的行为? [复制]
【发布时间】:2020-05-03 12:25:27
【问题描述】:

我试图对数组进行排序,而我在 Chrome V79 中得到了这种与 Firefox Dev Edition V72 不同的行为(都在桌面版中)。

这是测试,

console.log([4, 2, 5, 1, 3].sort((a, b) => a>b));
console.log(Array.prototype.sort.call([4, 2, 5, 1, 3], (a, b) => a>b));

在 Firefox Dev 中,我得到了这个结果,

但在 Chrome 中,为什么我会得到这个结果,

但是当我用 var 传递同一个数组时,我得到了这个,

但是是的,它对数组进行排序并重写变量,但返回数组的未排序版本。所以,当我在没有任何 var 的情况下直接传递数组时,我没有排序。但是,

按照MDN's reference page,它不应该返回排序后的数组吗??

为什么会有区别??

注意:在示例图像中,有两个示例我正在练习call func。并忘记删除它。所以,直接忽略吧。他们俩都是一样的。

【问题讨论】:

  • 正如您发布的链接中所说,您需要返回一个数字。您应该从排序函数返回01-1,而不是布尔值。
  • 你可能会读到为什么布尔返回值是个坏主意...stackoverflow.com/questions/24080785/…
  • 我认为 .sort((a,b) => a-b);是对数组升序进行排序的最简洁方式。
  • @AnonymousUser264 应该如何实现.sort() 的细节不是规范的一部分。 Chrome 和 Firefox 的算法略有不同。
  • 布尔值可以被强制转换为数字,但如果是,则 true = 1 和 false = 0。问题是对于排序回调,返回 0 意味着“这些值相等”。直到最近(如去年引入的标准),都不能保证Array.sort 的实现是稳定的——也就是说,不能保证相等的值会保持它们的相对位置。因此,当 a < b 时返回 false/0 可能“发生”用于稳定排序而不是不稳定排序,反之亦然,但不能保证。

标签: javascript arrays sorting


【解决方案1】:

正如 cmets 中所指出的,您提供的用于排序的函数应该返回:

  • 如果a 大于b,则为正数
  • 如果b 大于a,则为负数
  • 如果相等则为0

因此,您可以返回一个简单的表达式是 a - b 而不是 a > b(如果您想升序排序):

console.log([4, 2, 5, 1, 3].sort((a, b) => a-b));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多