Javascript-форум (https://javascript.ru/forum/)
-   Учебные материалы (https://javascript.ru/forum/study/)
-   -   Странное поведение массива с объектом (https://javascript.ru/forum/study/68452-strannoe-povedenie-massiva-s-obektom.html)

IsaacMech 18.04.2017 09:06

Странное поведение массива с объектом
 
Здравствуйте! Изучаю 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]. Я не могу понять в чём проблема. Буду рад, если кто-нибудь сможет объяснить что происходит.

IsaacMech 18.04.2017 09:50

Ох, я понял. То есть "присвоив" объёкту массива i + 1 объект i, то я просто сослался на его адрес в памяти, а не клонировал объект?

Rise 18.04.2017 10:01

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

IsaacMech 18.04.2017 10:03

Спасибо, что помогли разобраться!


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