Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поведение массивов при копировании. (https://javascript.ru/forum/misc/50416-povedenie-massivov-pri-kopirovanii.html)

FoxTrix 25.09.2014 15:24

Поведение массивов при копировании.
 
Добрый день.
Возникла такая проблема: есть у меня некий массив с данными(default_arr), далее я его копирую
var arr = default_arr.concat();

далее происходят некоторые изменения с массивом arr, но почему-то эти изменения применяются и к default_arr, что мне совершенно не нужно.
Почему так происходит? И как я могу их "разделить"?

Tek 25.09.2014 15:39

Не вижу проблему
var default_arr = [1,2,3];
var arr = default_arr.concat();
arr.push(6);
console.log(arr);
console.log(default_arr);

ksa 25.09.2014 15:39

Цитата:

Сообщение от FoxTrix
происходят некоторые изменения с массивом arr, но почему-то эти изменения применяются и к default_arr

Бивас, тест! (с)

var a1=[1,2,3,4,5];
var a2=a1.concat();
a2[1]=10;
alert(a1);
alert(a2);

Первый массив не меняется! :)

FoxTrix 25.09.2014 15:42

Вот и я думаю почему так, ведь проблемы быть не должно, т.к. раньше так тоже делал.
Есть момент о котором забыл упомянуть, массив трехмерный.

ksa 25.09.2014 15:51

Цитата:

Сообщение от FoxTrix
ведь проблемы быть не должно

Ее и нет. Я это продемонстрировал...

Цитата:

Сообщение от FoxTrix
Есть момент о котором забыл упомянуть, массив трехмерный.

В JS нет "трехмерных" массивов. Есть одномерный массив, элементом которого может быть ДРУГОЙ массив.

ksa 25.09.2014 15:54

Вот, что бывает с ДРУГИМ массивом. ;)

var a1=[1,2,[11,22,33],4,5];
var a2=a1.concat();
a2[1]=10;
alert(a1);
alert(a2);
a2[2][1]='Опа!';
alert(a1);
alert(a2);

FoxTrix 25.09.2014 15:57

Цитата:

Сообщение от ksa (Сообщение 332232)
Ее и нет. Я это продемонстрировал...

Её нет в примере. Когда я увидел эту ошибку, я и сам написал такой пример, и убедился что так быть не должно. Однако в коде я её наблюдаю. Если это поможет, могу выложить код, только он довольно объемный.

Цитата:

Сообщение от ksa (Сообщение 332232)
В JS нет "трехмерных" массивов. Есть одномерный массив, элементом которого может быть ДРУГОЙ массив.

Знание терминологии это хорошо, но мне бы сейчас совет всё-таки по практической части....

ksa 25.09.2014 15:58

FoxTrix, вот

var a1=[1,2,[11,22,33],4,5];
var a2=a1.concat();
a2[2]=a1[2].concat();
a2[1]=10;
a2[2][1]='new';
alert(a1);
alert(a2);

"Первый" массив опять не поменялся!

ksa 25.09.2014 15:59

Цитата:

Сообщение от FoxTrix
могу выложить код, только он довольно объемный

Кому нужен чужой, большой код? :) Для демонстрации нужно уметь делать тестовые примеры.

FoxTrix 25.09.2014 16:01

Ок, сам найду решение, спасибо.


Часовой пояс GMT +3, время: 18:23.