与compareFunction一起使用的排序方法背后的逻辑是什么
What is the logic behind the sort method used with a compareFunction?
我正在使用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 -----------------^
但是需要注意的是,当a
或b
是"Elvis"
或"R2D2"
时,您的比较函数(compareNumbers
)会返回NaN
,这意味着根据规范,它不是"一致比较函数"。这意味着sort
在这一点上所做的一切都是"实施定义的"—完全取决于JavaScript引擎的作者,完全不在规范中,并且可能因引擎而异。sort
希望看到负数0
或正数,而不是NaN
。things
数组根本不应该用数字排序,因为它的两个条目不是数字,也不能正确地转换为数字。
下面是一个正确使用比较器函数的例子:在这种情况下,它会使用您的数组,并根据转换为字符串的每个条目的长度对它们进行排序:
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
不是一个函数,因此会忽略它,并使用默认的排序算法。
相关文章:
- “var self = this”方法背后的原理是什么?
- React Router 如何处理 onEnter 背后的逻辑是什么?
- 让函数中的接收器默认为全局对象背后的基本原理是什么?
- AJAX 跨域安全背后的基本原理是什么?
- Facebook评论API - Facebook所说的“评论框背后”是什么意思
- Lightstreamer背后的魔力是什么
- d3背后的逻辑是什么.js nice()刻度
- JavaScript:“shift”方法背后的逻辑是什么?
- Math.max方法背后的逻辑是什么
- 与compareFunction一起使用的排序方法背后的逻辑是什么
- 用continuation生成Javascript代码背后的诀窍是什么
- 窗口背后的原因和窗口的顶部属性是什么
- 名称空间背后的概念是什么
- 堆栈溢出背后的算法是什么? ajax标记搜索字段
- 网站上的3D图像非常酷,但这背后的技术是什么?
- 使用Object.assign创建对象背后的思想是什么?
- canPlayType背后的原理是什么?
- javascript中var a = (expression1, expression2)背后的原因是什么?
- 错误处理-当JavaScript抛出ReferenceError时,其背后的逻辑是什么
- 选择一个完整的基于CSS的菜单和基于Javascript/CSS的菜单背后的基本原理是什么?