Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.04.2017, 09:06
Новичок на форуме
Отправить личное сообщение для IsaacMech Посмотреть профиль Найти все сообщения от IsaacMech
 
Регистрация: 18.04.2017
Сообщений: 3

Странное поведение массива с объектом
Здравствуйте! Изучаю JavaScript на Khan Academy и столкнулся с такой проблемой. Я хочу, чтобы массив с объектом увеличивался каждый раз, когда число меньше длины другого массива. Написал такой код:
var drawShelf = function() {
    for (var i = 0; i < diskShelf.length; i++) {
        diskShelf[i].capacity = floor(diskShelf[i].height / (diskShelf[i].space.disk + diskShelf[i].thickness.shelf));
        totalCapacity += diskShelf[i].capacity;
        if (totalCapacity < disk.length) {
            diskShelf.push(diskShelf[i]);
            println(diskShelf[i].x + " | " + diskShelf[i + 1].x + " / " + i);
            diskShelf[i + 1].x += diskShelf[i].width + diskShelf[i].space.shelf;
            println(diskShelf[i].x + " | " + diskShelf[i + 1].x + " / " + i); 
        }
    }
};

Вроде всё правильно, только вот почему-то операция ведёт себя как-то странно.
diskShelf[i + 1].x += diskShelf[i].width + diskShelf[i].space.shelf;

Вместо того, чтобы изменить значение в одном элементе массива diskShelf[i + 1], она меняет значение и в diskShelf[i]. В итоге получается, что diskShelf[i].x = diskShelf[i + 1]. Я не могу понять в чём проблема. Буду рад, если кто-нибудь сможет объяснить что происходит.
Ответить с цитированием
  #2 (permalink)  
Старый 18.04.2017, 09:50
Новичок на форуме
Отправить личное сообщение для IsaacMech Посмотреть профиль Найти все сообщения от IsaacMech
 
Регистрация: 18.04.2017
Сообщений: 3

Ох, я понял. То есть "присвоив" объёкту массива i + 1 объект i, то я просто сослался на его адрес в памяти, а не клонировал объект?
Ответить с цитированием
  #3 (permalink)  
Старый 18.04.2017, 10:01
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 458

IsaacMech, да
var object = { x: 0 };

var array = [object];

// array  => [{ x: 0 }]

array.push(array[0]);

// array  => [{ x: 0 },{ x: 0 }]

array[1].x = 1;

// array  => [{ x: 1 },{ x: 1 }]
// object =>  { x: 1 }

array[0].y = 2;

// array  => [{ x: 1, y: 2 },{ x: 1, y: 2 }]
// object =>  { x: 1, y: 2 }

object.z = 3;

// object =>  { x: 1, y: 2, z: 3 }
// array  => [{ x: 1, y: 2, z: 3 },{ x: 1, y: 2, z: 3 }]
для клонирования есть Object.assign()

Последний раз редактировалось Rise, 18.04.2017 в 10:21.
Ответить с цитированием
  #4 (permalink)  
Старый 18.04.2017, 10:03
Новичок на форуме
Отправить личное сообщение для IsaacMech Посмотреть профиль Найти все сообщения от IsaacMech
 
Регистрация: 18.04.2017
Сообщений: 3

Спасибо, что помогли разобраться!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное поведение jQuery borodatych Javascript под браузер 5 27.02.2014 11:47
Аномальное поведение массива в Firefox Megas Firefox/Mozilla 2 23.09.2013 01:05
Странное поведение array.length antserg jQuery 1 05.01.2013 14:31
Странное поведение переменной mycoding Серверные языки и технологии 4 14.01.2011 19:18
Странное поведение replace cooli0 Общие вопросы Javascript 4 25.01.2010 17:16