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

Javascript 在Chrome中使用array.prototype.sort时数组的奇怪排序,javascript,arrays,sorting,v8,Javascript,Arrays,Sorting,V8,我在使用数字数组时发现了一个奇怪的现象,我不确定是什么导致了它 我的目标是使用排序(而不是使用反转)反转数组,这样我就可以像这样链接它: const shouldReverse=Math.random()>0.5, 结果=foo().bar().map(…).reverseIf(shouldReverse); 我相信我应该能够使用排序来实现这一点,这在某些情况下似乎有效,但在其他情况下则无效 以下是一个工作示例: constmyarray=['a','b','c','d'], mySorted

我在使用数字数组时发现了一个奇怪的现象,我不确定是什么导致了它

我的目标是使用
排序
(而不是使用
反转
)反转数组,这样我就可以像这样链接它:

const shouldReverse=Math.random()>0.5,
结果=foo().bar().map(…).reverseIf(shouldReverse);
我相信我应该能够使用
排序
来实现这一点,这在某些情况下似乎有效,但在其他情况下则无效

以下是一个工作示例:

constmyarray=['a','b','c','d'],
mySortedArray=myArray.sort(()=>1);
console.log(mySortedArray);
[“d”、“c”、“b”、“a”]
还有一个不起作用的例子:

constmyarray=['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引擎中某种形式的优化吗

我相信我应该能够通过
sort

不,你不应该。你在找我

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

myArray.sort((a, b) => (a<b)-(b<a));
这是一个好主意。你不能指望这会奏效

这仅在Chrome中发生,并且仅当阵列中的元素超过10个时才会发生


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

我认为所使用的排序算法取决于实现——你不能保证得到气泡排序,也不能保证它从左到右是线性的(反之亦然),因此返回一个常量作为排序的东西,可能真的会弄乱算法。简言之,是的,如果你采用“不同的排序算法”,这可能是“优化”。你是否看到链接到的页面上的第二行:“默认排序顺序根据字符串Unicode代码点。”?您的问题显示对字符串进行排序,但第一句是指一个数字数组。如果你给它一个比较字符串的函数,它就会工作。我忘了在OP中提到它,但我最初发现使用数字时的问题,而使用数字时的问题完全相同。实际上,要回答导致此问题的问题,如果你想使用
排序
,然后,您首先需要排序函数,但是您可以非常简单地通过执行的
reverse=x=>()=>x*-1
使它们以相反的方式工作,如果您想更奇特
reverse=(f)=>function(){return f.apply(这是参数)*-1;}
如果数组项之间的每个比较都是按初始顺序进行的,那么我希望这种方法能够起作用。在Chrome的排序算法中,您甚至不能仅在比较函数中引用正在排序的数组项。我猜FF使用了一种合并排序,而Chrome显然在做这项工作时完全不同。我对此也很感兴趣。就我所知,贝基所说的完全正确。如果不是,我真的很想知道。
myArray.sort(() => 1)