Почему значение array2 [[], [], [], [], []] в конце цикла?

var array1 = [];
var array2 = [];

for (let i = 1; i <= 10; i++) {
  array1.push(i);
  if (i % 2 === 0) {
    //console.log(array1);
    array2.push(array1);
    array1.length = 0;
  };
};
console.log(array1);
console.log(array2);

Кто-нибудь может объяснить, что происходит в этом коде?

2
Karan Dhir 20 Авг 2018 в 21:19

4 ответа

Лучший ответ

Массивы в JavaScript являются изменчивыми структурами. array1 очищается каждый раз, присваивая 0 length. Есть только 5 четных чисел от 1 до 10 (а именно: 2, 4, 6, 8, 10), поэтому в array2 есть 5 ссылок на array1.

4
Daniel A. White 20 Авг 2018 в 18:22

Потому что когда вы нажимаете переменную массива / объекта, вы сохраняете ссылку, а не значение. Делая длину array1 равной 0, так как вы знаете, что удаляете значения array1, и это приводит к результату, который вы видите для array2.

Если вы хотите получить ожидаемое поведение, вы можете создавать новый массив перед каждым push-запросом, например:

var array1 = [];
var array2 = [];

for (let i = 1; i <= 10; i++) {
  array1.push(i);
  if (i % 2 === 0) {
    array2.push(Array.from(array1));
    array1.length = 0;
  };
};
// []
console.log(array1);
// [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ], [ 9, 10 ] ]
console.log(array2);
1
Jose Mato 20 Авг 2018 в 18:30

Другие ответы уже объяснили, что происходит, вот что нужно сделать, чтобы получить то, что вы ожидали:

var array1 = [];
var array2 = [];

for (let i = 1; i <= 10; i++) {
  array1.push(i);
  if (i % 2 === 0) {
    //console.log(array1);
    array2.push([...array1]);
    array1.length = 0;
  };
};
console.log(array1);
console.log(array2);

Вы можете просто использовать новую функцию ECMAScript под названием деструктуризация массива [...arr] (деструктуризация в новый массив), которая создает поверхностную копию массива, к которому она применяется.

1
connexo 20 Авг 2018 в 18:28

Это из-за array1.length = 0;.

Вы указываете на ту же ссылку на массив и устанавливаете ее пустой.

Технически, вы выдвигаете новый пустой массив для каждого четного числа в итерации.

1
Sushanth -- 20 Авг 2018 в 18:22
51936493