为什么sort()对数组中数字排序时,采用
sort(function(a, b) {
return a-b;
}
)
代码即可实现对数组的升序排列?
sort()方法对于数组排序,在其中参数使用了比较函数compareFunction,那么会根据compareFunction的返回值进行排序。具体规定如下:
如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
- 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
- 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript
标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本); - 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
- compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
对于纯数字
sort(function(a, b) {
return a-b;
}
)
等价于
sort(function(a,b){
if(a>b){
return 1;
}
if(a<b){
return -1;
}
return 0;
}
)
都属于升序排列。
具体理解其实就是一个初中数学的分类讨论问题。
(1)当a<b时,a-b<0。即return 一个负值。
根据compareFunction 的行为定义,a 会被排列到 b 之前,是升序排列方式。
(2)当a>b时,a-b>0。即return 一个正值。
根据compareFunction 的行为定义,b 会被排列到 a之前,也是升序排列方式。
(3)当a=b时,a-b=0。即return 零。
根据compareFunction 的行为定义,a 和 b 的相对位置不变。
综合(1)(2)(3)所述,代码
sort(function(a, b) {
return a-b;
}
)
可以满足数字数组的升序排列要求。降序排列可同理推导。