javascript 有人能解释一下为什么array2会被排序吗,如果我只在array1上应用了排序,并且创建了array2作为一个新的数组?

gcmastyq  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(84)
let array1 = [88,66,33,44,11,67,32,56];
let array2  = new Array(array1);
array1.sort();
console.log(array2);

用随机值创建了一个array1。用new关键字创建了一个array2并用array1初始化它。排序了array1并打印出array2。我希望array2是未排序的

xxhby3vn

xxhby3vn1#

new Array被调用时,会发生很多事情。

  • 如果没有传递参数,则创建一个空数组。
  • 如果传递了一个参数,并且该参数是一个数字,则创建一个长度为该数字的新数组。
  • 如果传递了一个参数,并且该参数不是数字,则会创建一个新数组,该数组只有一个值,即所传递参数的值。
  • 如果传递了多个参数,则创建一个新数组,每个参数都有一个值。

所以如果你传递一个非数值参数,你会创建一个新的数组,这个数组的参数是一个值,而传递一个数组的参数会创建一个只有一个值的数组,这个值就是传递的数组.
该值是 * 传递的数组本身 *,而不是副本:

const array1 = [88,66,33,44,11,67,32,56];
const array2  = new Array(array1);
console.log(array2[0] === array1);

因此,当您对数组排序时(使用array1array2[0]的引用),因为它们引用同一个数组,所以无论您稍后检查哪个数组,都会看到排序后的结果。
我期望array2是未排序的
请正确复制数组。不要使用new Array

const array2 = [...array1];
nbnkbykc

nbnkbykc2#

传递给Array constructor的参数是新数组中的元素(除非是数字)。
当你把array1传递给构造函数时,它不会被克隆,而是被设置为新数组的第一项。
如果要克隆它,可以扩展数组,这会将它转换为参数列表,Array构造函数将根据该列表创建新数组。

let array1 = [88,66,33,44,11,67,32,56];
let array2  = new Array(...array1);
array1.sort();
console.log(array2);
fumotvh3

fumotvh33#

let array2  = new Array(array1);

不复制array1。它等效于:

let array2 = [array1];

这将创建一个数组,该数组的第一个元素是对与array1相同的数组的引用。
然后对array1所做的任何修改也会影响array2[0],反之亦然。
要创建array1的浅层副本,请用途:

let array2 = [...array1];

相关问题