var array=[5,363,54,6,45,9,54]; var result1=array.sort(function(a,b) { return a-b; }); var result2=array.sort(function(a,b) { return -(a-b); }); document.write("顺序排列:"+result1+"\n倒序排列:"+result2);
以上代码输出的result1与result2均为倒序排列,不知是为什么?请各位大大指点
知道什叫引用类型么
var array=[5,363,54,6,45,9,54];
var result1=array.sort(function(a,b) {
return a-b;
});
console.log(array);
console.log(result1)
var result2=array.sort(function(a,b) {
return -(a-b);
});
console.log(array);
console.log(result2)
2
感谢回复,能否再详细解释下
@yamybl:
api说明:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
arr.sort。是对arr数组对象本身进行排序。而不是对arr排序返回一个新对象。
所以 arr,result1,result2。实际是同一个对象。
@calvinK: 已经明白了,多谢!
你应该在排序之前先输出一下。。。
可以去看下值类型和引用类型的内存分配情况就明白其中的原因了
数组元素的方法排序sort()和插入删除splice()都会改变数组本身,他们操作的是数组的存储位置,执行了之后原数组是会改变的。而数组的方法slice()和concat()等方法是对数组元素的值进行操作的,并不会改变原数组的存储位置。所以你先sort()正排序了之后得到了一个从小到大的排序,此时你console.log()一下就是你要的正序result1;但是你后来又操作了这个数组,反序排列之后原数组本身array又被改变了,此时是反序result2。而result1和result2都是浅拷贝数组array的,也就是说只是把数组的地址给了他俩,他俩实际上只是array的一个引用(你可以把它想象成是镜子里的投影),因此本体array改变了之后他俩都会改变,这仨值是一样的,表示的都是一个东西。关于浅拷贝和深拷贝你可以去查查相关资料,博客园有好多详细讲解。
sort()方法本身带有排序的意思,我们一般在js中排序都需要利用到这个sort()方法,如果是字母,他会以字母的ascll码去排序,如果是数字,也是类似的。所以我们需要借助形参/实参来进行比较,并且利用sort()这个方法进行排序。我是这样理解的。嘻嘻,初学者,有说的不对的地方,请多包涵。谢谢。
谢谢回复!
对数组调用sort方法,会改变原来的数组