首页 新闻 会员 周边

关于js中sort()排序函数的疑问,期盼各位大大指点,多谢! (有分!)

0
悬赏园豆:50 [已解决问题] 解决于 2016-09-22 19:34
复制代码
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均为倒序排列,不知是为什么?请各位大大指点

 
yamybl的主页 yamybl | 初学一级 | 园豆:77
提问于:2016-09-22 16:35
< >
分享
最佳答案
1

知道什叫引用类型么

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)

收获园豆:35
czd890 | 专家六级 |园豆:14312 | 2016-09-22 16:42

2

czd890 | 园豆:14312 (专家六级) | 2016-09-22 16:50

感谢回复,能否再详细解释下

yamybl | 园豆:77 (初学一级) | 2016-09-22 17:06

@yamybl: 

api说明:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

arr.sort。是对arr数组对象本身进行排序。而不是对arr排序返回一个新对象。

所以 arr,result1,result2。实际是同一个对象。

czd890 | 园豆:14312 (专家六级) | 2016-09-22 17:15

@calvinK: 已经明白了,多谢!

yamybl | 园豆:77 (初学一级) | 2016-09-22 19:32
其他回答(5)
0

你应该在排序之前先输出一下。。。

收获园豆:5
顾晓北 | 园豆:10844 (专家六级) | 2016-09-22 17:08
0

可以去看下值类型和引用类型的内存分配情况就明白其中的原因了

收获园豆:5
~扎克伯格 | 园豆:1923 (小虾三级) | 2016-09-22 17:09
0

数组元素的方法排序sort()和插入删除splice()都会改变数组本身,他们操作的是数组的存储位置,执行了之后原数组是会改变的。而数组的方法slice()和concat()等方法是对数组元素的值进行操作的,并不会改变原数组的存储位置。所以你先sort()正排序了之后得到了一个从小到大的排序,此时你console.log()一下就是你要的正序result1;但是你后来又操作了这个数组,反序排列之后原数组本身array又被改变了,此时是反序result2。而result1和result2都是浅拷贝数组array的,也就是说只是把数组的地址给了他俩,他俩实际上只是array的一个引用(你可以把它想象成是镜子里的投影),因此本体array改变了之后他俩都会改变,这仨值是一样的,表示的都是一个东西。关于浅拷贝和深拷贝你可以去查查相关资料,博客园有好多详细讲解。

收获园豆:5
刘冰0117 | 园豆:102 (初学一级) | 2016-09-22 18:30
0

sort()方法本身带有排序的意思,我们一般在js中排序都需要利用到这个sort()方法,如果是字母,他会以字母的ascll码去排序,如果是数字,也是类似的。所以我们需要借助形参/实参来进行比较,并且利用sort()这个方法进行排序。我是这样理解的。嘻嘻,初学者,有说的不对的地方,请多包涵。谢谢。

smille2020 | 园豆:248 (菜鸟二级) | 2016-09-26 09:36

谢谢回复!

支持(0) 反对(0) yamybl | 园豆:77 (初学一级) | 2016-09-26 09:45
0

对数组调用sort方法,会改变原来的数组

QxQstar | 园豆:212 (菜鸟二级) | 2017-04-29 21:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册