JS中sort()方法返回值?

今天因为业务需要,使用了很久没有使用的函数sort()

其实使用很简单,但是今天不小心发现一句官方的解释,原话是:“返回值:对数组的引用。请注意,数组在原数组上进行排序,不生成副本。”

这句话就有点没搞懂到底是什么意思了

对数组的引用是什么鬼

比如:

var list= [
{name:"小妹",datetime: "2021-07-09"},
{name:"小妹",datetime: "2021-03-09"},
{name:"小妹",datetime: "2021-09-09"}
]
list.sort(function(a, b) {
   return a.datetime - b.datetime ? 1 : -1 
});

我可以:(情况一)

let newArr = list.sort(function(a, b) {
    return new Date(a.datetime).getTime() - new
    Date(b.datetime).getTime()
});
console.log(newArr)

也可以:(情况2)

list.sort(function(a, b) {
    return new Date(a.datetime).getTime() - new
    Date(b.datetime).getTime()
});
console.log(list)

两个都可以

矛盾就在这,如果是情况1,那说明返回的是新数组,那‘对数组的引用’是什么意思?不是表示不返回新数组?

有没有大佬可以解释一下这句非人类语言要表达什么呢?

阅读 3.2k
6 个回答

“人话版本”:就是说 sort() 会修改原数组项的排序,sort() 结束后会返回一个数组结果,这个结果其实就是原数组。并不是说会返回一个新的数组给你。

JS内存模型简单解释
JS 分为栈内存和堆内存,栈内存可以存储变量基础类型数据和堆内存地址,堆内存可以存复杂数据。
数组数据是存在堆内存中的,栈内存中存储的变量对应的只是堆内存中的地址。newArr = list 就相当增加一个变量 newArr -> ADDR1list -> ADDR1 指向同一个堆内存地址。
什么是引用?
引用就是别名。同样是指向 ADDR1,可以是 listnewArrlist1 任意变量,都是它的引用。

var num = 1
var list = [1,2,3,4]

image.png

新的变量赋值之后,堆内存地址不会改变,只是多了个 newAr 指向这个地址。

var newArr = list.sort(....)

image.png

list === newArr , 你可以理解为链式调用 $('div').attr('a',1).attr('b',2)

image.png

你可以尝试修改一下newArr里面的元素,比如

newArr[0]['name'] = 123;

然后再看下list的数组里面的元素内容。

然后你就明白了

意思是,newArr是list的引用。
因为是引用,所以排序结果会改变原数组。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题