Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.09.2014, 15:24
Аспирант
Отправить личное сообщение для FoxTrix Посмотреть профиль Найти все сообщения от FoxTrix
 
Регистрация: 27.07.2012
Сообщений: 73

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

далее происходят некоторые изменения с массивом arr, но почему-то эти изменения применяются и к default_arr, что мне совершенно не нужно.
Почему так происходит? И как я могу их "разделить"?
Ответить с цитированием
  #2 (permalink)  
Старый 25.09.2014, 15:39
Аватар для Tek
Tek Tek вне форума
Профессор
Отправить личное сообщение для Tek Посмотреть профиль Найти все сообщения от Tek
 
Регистрация: 22.02.2012
Сообщений: 212

Не вижу проблему
var default_arr = [1,2,3];
var arr = default_arr.concat();
arr.push(6);
console.log(arr);
console.log(default_arr);
Ответить с цитированием
  #3 (permalink)  
Старый 25.09.2014, 15:39
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

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

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

Первый массив не меняется!
Ответить с цитированием
  #4 (permalink)  
Старый 25.09.2014, 15:42
Аспирант
Отправить личное сообщение для FoxTrix Посмотреть профиль Найти все сообщения от FoxTrix
 
Регистрация: 27.07.2012
Сообщений: 73

Вот и я думаю почему так, ведь проблемы быть не должно, т.к. раньше так тоже делал.
Есть момент о котором забыл упомянуть, массив трехмерный.
Ответить с цитированием
  #5 (permalink)  
Старый 25.09.2014, 15:51
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от FoxTrix
ведь проблемы быть не должно
Ее и нет. Я это продемонстрировал...

Сообщение от FoxTrix
Есть момент о котором забыл упомянуть, массив трехмерный.
В JS нет "трехмерных" массивов. Есть одномерный массив, элементом которого может быть ДРУГОЙ массив.
Ответить с цитированием
  #6 (permalink)  
Старый 25.09.2014, 15:54
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

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

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);
Ответить с цитированием
  #7 (permalink)  
Старый 25.09.2014, 15:57
Аспирант
Отправить личное сообщение для FoxTrix Посмотреть профиль Найти все сообщения от FoxTrix
 
Регистрация: 27.07.2012
Сообщений: 73

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

Сообщение от ksa Посмотреть сообщение
В JS нет "трехмерных" массивов. Есть одномерный массив, элементом которого может быть ДРУГОЙ массив.
Знание терминологии это хорошо, но мне бы сейчас совет всё-таки по практической части....
Ответить с цитированием
  #8 (permalink)  
Старый 25.09.2014, 15:58
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

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);

"Первый" массив опять не поменялся!
Ответить с цитированием
  #9 (permalink)  
Старый 25.09.2014, 15:59
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от FoxTrix
могу выложить код, только он довольно объемный
Кому нужен чужой, большой код? Для демонстрации нужно уметь делать тестовые примеры.
Ответить с цитированием
  #10 (permalink)  
Старый 25.09.2014, 16:01
Аспирант
Отправить личное сообщение для FoxTrix Посмотреть профиль Найти все сообщения от FoxTrix
 
Регистрация: 27.07.2012
Сообщений: 73

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное поведение при делегировании mcreature jQuery 3 25.05.2014 02:18
Изменение прозрачности при клике AJIUK jQuery 8 09.03.2014 16:00
при нажатии на раздел меню поворачивается маркер Сергей545 Элементы интерфейса 5 08.12.2013 22:15
При клике на ссылку ничего не происходит gurg0n Элементы интерфейса 2 24.06.2013 11:11
Кратное увеличение при клике на кнопку vabus Элементы интерфейса 2 15.04.2013 20:42