在Chrome中使用Array.prototype.sort时奇怪的数组排序

时间:2016-09-28 15:13:13

标签: javascript arrays sorting v8

我在数字数组上使用Array.prototype.sort()时发现了一个奇怪的现象,我不确定导致它的原因。

我的目标是使用sort(不使用reverse)来反转数组,因此我可以将其链接起来:

const shouldReverse = Math.random() > 0.5,
      result = foo().bar().map(...).reverseIf(shouldReverse);

我相信我应该能够使用sort来实现这一目标,这似乎在某些情况下有效但在其他情况下却无效。

这是一个有效的例子:

const myArray = ['a', 'b', 'c', 'd'],
      mySortedArray = myArray.sort(() => 1); 

console.log(mySortedArray);
["d", "c", "b", "a"]

一个不起作用的例子:

const myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'],
      mySortedArray = myArray.sort(() => 1); 

console.log(mySortedArray);
["f", "k", "a", "j", "i", "h", "g", "b", "e", "d", "c"]

这只发生在Chrome中,并且只有在阵列中有超过10个元素时才会发生 - 这可能是Chrome V8引擎中的某种形式的优化吗?

1 个答案:

答案 0 :(得分:3)

  

我相信我应该可以使用sort

来实现这一目标
不,你不应该。您正在寻找reverse

对于已经按升序排序的特定示例,您可以通过传递导致降序的比较函数来实现反转,但这对于具有任意值的任意数组都不起作用。

myArray.sort((a, b) => (a<b)-(b<a));
myArray.sort(() => 1)

那是totally inconsistent comparison function。你不能指望它能发挥作用。

  

这只发生在Chrome中,并且只有在数组中有超过10个元素时才会发生

这是因为Chrome中的JS引擎对小数组使用了不同的排序算法,它以不同的顺序进行比较,显然总是在第二个参数中使用较高的索引项。你很幸运。