Javascript .sort函数是否更改原始数组?

Javascript .sort函数是否更改原始数组?,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有这样的密码: arr = arr.sort(function (a, b) { return a.time>b.time }) 我是否需要重新定义arr,或者可以只调用sort函数? 像这样: arr.sort(function (a, b) { return a.time>b.time }) 排序和筛选功能是否会更改原始数组?它将数组排序到位(修改数组)。发件人: sort()方法对数组中的元素进行适当排序并返回 阵列。这种情况不一定稳定。默认排序顺序 是根

我有这样的密码:

arr = arr.sort(function (a, b) {
    return a.time>b.time
})
我是否需要重新定义arr,或者可以只调用sort函数? 像这样:

arr.sort(function (a, b) {
    return a.time>b.time
})

排序和筛选功能是否会更改原始数组?

它将数组排序到位(修改数组)。发件人:

sort()方法对数组中的元素进行适当排序并返回 阵列。这种情况不一定稳定。默认排序顺序 是根据字符串Unicode代码点

使用
slice()
对原始数组的副本进行排序

var arr =[{time:4},{time:3},{time:6}];

arr.sort(function (a, b) {
  return a.time-b.time;
});
const a = [1, 2, 3];
const b = a.sort();
const c = [...a].sort(); //es6 feauture similar to slice(0)
console.log(a === b); // true
console.log(a === c);//false
将对原始数组和 返回:

[{time:3},{time:4},{time:6}]

和console.log(arr)返回

[{time:3},{time:4},{time:6}]

但是

返回

[{time:3},{time:4},{time:6}]

但不会影响原始阵列

var arr =[{time:4},{time:3},{time:6}];

arr.sort(function (a, b) {
  return a.time-b.time;
});
const a = [1, 2, 3];
const b = a.sort();
const c = [...a].sort(); //es6 feauture similar to slice(0)
console.log(a === b); // true
console.log(a === c);//false
console.log(arr)返回

[{time:4},{time:3},{time:6}]


这是一个不错的问题,让我们正确地回答:

const a = [1, 2, 3];
const b = a.sort();
console.log(a === b); // true
这是你的答案。对象的
=
操作符将比较内存位置,因此它是内存中的同一个对象

这是一个遗憾,因为如果sort创建一个新数组(不变性等)会更好,但在许多语言中,它不会返回一个新数组,而是返回相同的数组(重新排序)

因此,如果您希望它是不可变的,您可以这样做:

const a = [1, 2, 3];
const b = a.slice(0).sort();

是的,它修改原始数组

var arr =[{time:4},{time:3},{time:6}];

arr.sort(function (a, b) {
  return a.time-b.time;
});
const a = [1, 2, 3];
const b = a.sort();
const c = [...a].sort(); //es6 feauture similar to slice(0)
console.log(a === b); // true
console.log(a === c);//false

我试过了,我无法忍受为什么有时候它不起作用。我的代码中有问题吗?或者我误用了.sort函数。两者都可以工作。随着
排序
更改数组。但是比较器函数将基于(+n,0,-n)的返回值工作,而不是
布尔值。请更换比较器。我真的不知道这个问题出了什么问题,但可以使用===运算符在排序前后对它进行测试。我发现这里的答案非常不令人满意,所以我添加了一个我认为更好的答案。的一个有趣特性是
“未定义的属性值总是排序到结果的末尾,然后是不存在的属性值”
,因此它有效地将稀疏数组更改为压缩,但保留原始长度。是!sort()更改原始数组。过滤器()函数创建一个过滤后的副本,保留原始数据。实际上,我很喜欢它对原始数据进行变异。因为,你可以处理并解决这个问题。你不能解决“我希望对这个数组进行排序,以便现有引用获得更新的数据”,但它们不会自动进行。想象一下如果
arr.push(4,5,6)
没有对原始版本进行变异。那将是一场噩梦。您必须完全依赖
arr=arr.concat([4,5,6])
,并且仍然无法更新引用。