Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Не понятное поведение при копирование массива (https://javascript.ru/forum/events/33983-ne-ponyatnoe-povedenie-pri-kopirovanie-massiva.html)

cyber 16.12.2012 23:17

Не понятное поведение при копирование массива
 
Вроде все просто и понятно, но что то не так и не как не могу понять что
console.log("Уровень " + Number + " загружен");

           if (!Levels[Number]) throw "Ошибка: Уровень не найден!";

           console.log("Рисование Уровня...");

           self.Current = Levels[Number];

           self.CurrentMatrix = self.Current.TextureMatrix.slice(0);// вот тут копируется массив 

           obj_draw = new Draw(self.Current, DrawCallback);// внутри функции  идет обращение к свойству CurrentMatrix

на прямую self.Current.TextureMatrix обращения к массиву нет ,обращение только к CurrentMatrix, но исходный массив все равно изменяется, уже час голову ломаю не могу понять почему...

cyber 16.12.2012 23:26

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

dmitriymar 17.12.2012 00:04

Цитата:

Сообщение от cyber
Number

а как насчёт использования зарезервированных слов?:)
http://javascript.ru/Number

Deff 17.12.2012 00:05

cyber,
Имхо связано со .slice()

Скопируй вначале в переменную,
var a = self.Current.TextureMatrix.slice(0);
self.CurrentMatrix = a;

cyber 17.12.2012 00:16

Deff, не помогло=(

cyber 17.12.2012 00:17

dmitriymar, спс поправил, но не один браузер не среагировал на эту ошибку...

nerv_ 17.12.2012 14:27

cyber, на понимаю, какой ответ ты хочешь получить, не показывая код функции-конструктора Draw.

BallsShaped 17.12.2012 14:49

Цитата:

Сообщение от cyber
не один браузер не среагировал на эту ошибку

Это не ошибка, а Number - не зарегистрированное слово.

У тебя в self.Current.TextureMatrix ведь тоже объекты, небось тоже массивы? Их тоже нужно клонировать.

BallsShaped 17.12.2012 14:55

Мне кажется удачным копировать объекты через Object.create:
var matrix = [[1]];
var matrix_copy = matrix.map(function ( x ){
  return Object.create( x );
});

matrix_copy[0][0] = 2;

alert( matrix[0][0], matrix_copy[0][0] );

nerv_ 17.12.2012 15:22

Цитата:

Сообщение от BallsShaped
а Number - не зарегистрированное слово

это глобальный конструктор
alert( Number );

в самом низу страницы http://sahart.ru/javascript/view_javaruk.php?id=2

Цитата:

Сообщение от BallsShaped
У тебя в self.Current.TextureMatrix ведь тоже объекты, небось тоже массивы?

все указывает на это :) (что объекты)


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