与compareFunction一起使用的排序方法背后的逻辑是什么

What is the logic behind the sort method used with a compareFunction?

本文关键字:背后 是什么 方法 排序 一起 compareFunction      更新时间:2023-09-26

我正在使用comapreFunction尝试sort()方法,但我不明白compareNumber()是如何工作的。与两个变量一起使用时,它返回-3,但当与sort方法一起用于数组时,它会返回一个已排序的数组。为什么它是这样工作的?

var things = ['Elvis',555,'R2D2'];
function compareNumbers(a, b){
  return a-b;
}
var a = 5;
var b = 8;
console.log(compareNumbers(a,b)); //returns -3
console.log(compareNumbers(things));//returns NaN
console.log(things.sort(compareNumbers(a,b)));//returns a sorted array

与compareFunction一起使用的排序方法背后的逻辑是什么,以便返回已排序的数组?为什么它不返回NaN?

在哪里可以检查库或文档之类的方法背后的代码?

我看到了这个Understanding sort()compareFunction,但在这个阶段它对我来说太棒了。

您正在调用compareNumbers并将其返回值传递到sort,这不是您想要的。您想要将函数传递到sort中,因此sort将其称为:

console.log(things.sort(compareNumbers));
// No (), no a and b -----------------^

但是需要注意的是,当ab"Elvis""R2D2"时,您的比较函数(compareNumbers)会返回NaN,这意味着根据规范,它不是"一致比较函数"。这意味着sort在这一点上所做的一切都是"实施定义的"—完全取决于JavaScript引擎的作者,完全不在规范中,并且可能因引擎而异。sort希望看到负数0或正数,而不是NaNthings数组根本不应该用数字排序,因为它的两个条目不是数字,也不能正确地转换为数字。

下面是一个正确使用比较器函数的例子:在这种情况下,它会使用您的数组,并根据转换为字符串的每个条目的长度对它们进行排序:

var things = ['Elvis',555,'R2D2'];
function compareLengths(a, b){
  return String(a).length - String(b).length;
}
snippet.log(things.sort(compareLengths));
<!-- Temporary snippet object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

compareNumbers(a,b)返回-3,因此您正在调用things.sort(-3)。由于-3不是一个函数,因此会忽略它,并使用默认的排序算法。