今天在研究sort的内部实现中,发现sort()在调用比较函数compare的时候,传入的是compare,由于我在调用的时候,一直写的sort(compare()),导致输出结果与预期不符合,后面看了书上的例子发现原来是sort(compare),如下
1、sort(compare())
function compare(n1,n2){
if(n2>n1){
return 1
}
else if(n2<n1){
return -1
}
else{
return 0
}
}
var values=[0,15,5,10]
values.sort(compare())
console.log(values);//[0, 10, 15, 5]
1、sort(compare)
function compare(n1,n2){
if(n2>n1){
return 1
}
else if(n2<n1){
return -1
}
else{
return 0
}
}
var values=[0,15,5,10]
values.sort(compare)
console.log(values);//[15, 10, 5, 0]
为什么会这样呢,其实是因为在调用函数时,加括号和不加括号是有区别的,加括号表示传入的参数是调用函数的结果,不加括号传入的参数是函数对象,也就是整个函数体,所以两次运行结果不同。
除此之外,对于sort()函数也需要说明,sort()会调用每一项的toString()方法,再比较所得到的字符串,所以有以下结果:
var values=[0,15,5,10]
values.sort()
console.log(values);//[0, 10, 15, 5]
因此,想要实现对数组数值的排序,需要传入一个比较函数,实现对数值的比较。
升序:
function compare(n1,n2){
return n1-n2;
}
var values=[0,15,5,10]
values.sort(compare)
console.log(values);//[0, 5, 10, 15]
降序:
function compare(n1,n2){
return n2-n1;
}
var values=[0,15,5,10]
values.sort(compare)
console.log(values);//[15, 10, 5, 0]