Javascript Firefox Array.prototype.sort-此行为正确吗?

Javascript Firefox Array.prototype.sort-此行为正确吗?,javascript,arrays,sorting,firefox,Javascript,Arrays,Sorting,Firefox,我注意到Firefox中有一种奇怪的排序行为。在控制台上运行以下代码: [1,2,3].sort ( (a,b) => 1 ) 在Chrome/Chrome(linux和Windows)上,我得到[1,2,3] 在边缘我得到[1,2,3] 在FireFox(Linux和Windows)上,我得到[3,2,1] Firefox的这种行为是否不正确?您的排序比较器函数不符合此类函数的要求,因此该行为未定义。比较器函数必须始终为任何一对元素返回相同的“结论”值,无论元素作为参数传递的顺序如何。

我注意到Firefox中有一种奇怪的排序行为。在控制台上运行以下代码:

[1,2,3].sort ( (a,b) => 1 )
在Chrome/Chrome(linux和Windows)上,我得到
[1,2,3]

在边缘我得到
[1,2,3]

在FireFox(Linux和Windows)上,我得到
[3,2,1]


Firefox的这种行为是否不正确?

您的排序比较器函数不符合此类函数的要求,因此该行为未定义。比较器函数必须始终为任何一对元素返回相同的“结论”值,无论元素作为参数传递的顺序如何。您的函数向内部排序算法指示(例如)1应出现在2之后,但2也应出现在1之后。由于这种不一致性,您会得到错误的结果

比较器可以做任何它想做的事情,但是对于数组a和b中的任意两个元素,结果应该是

  • -1(或任何负数),如果排序数组中a应出现在b之前
  • 1(或任何正数),如果b应出现在排序数组中的a之前
  • 如果元素的顺序已经正确,则为0
这对于两个元素来说必须是正确的,不管它们实际上是如何被传递到比较器的,并且无论相同的两个元素被比较多少次,它必须是一致的


编辑-实际上,结果只需要有正确的符号;它们实际上不必是1或-1,只是一个负值或正值。这使得比较数字更容易,因为
a-b
给出了正确的结果(负、正或零)。

是的,我认为这就是原因。实际上,我简化了我的示例,从一段错误代码中,有人试图通过将[1,2,3].sort((a,b)=>a-b)替换为[1,2,3].sort((a,b)=>a+b)来颠倒排序顺序。他的单元测试在他的浏览器中有效,但在我的浏览器中无效。据推测,Firefox正在使用bubblesort或类似的方法来进行小的输入,因此每一对都被比较了不止一次。