Object.assign javascript

:) Вот я создаю 3 объекта:

let user = { who: "God", age: 13759613215 };
let obj1 = { someKey1: "dsvygsd" };
let obj2 = { someKey2: "sdvtglmha" };

Копирую свойства obj1 и obj2 и user.

Object.assign( user, obj1, obj2 );

Вызываю ключи через alert.

for (let key in user) {
    alert(key);
}

Ну и всплывающее окно выводит их по порядку: who, age, someKey1, someKey2.

И вот ставлю я значит скобки квадратные тут

Object.assign( user, [obj1, obj2] );

И теперь цикл

for (let key in user) {
        alert(key);
    }

Выдает мне: 0, 1, who, age. Почему там 0 и 1?


Ответы (4 шт):

Автор решения: Igor

Потому что [obj1, obj2] - это массив с индексами 0 и 1.

let obj1 = { someKey1: "dsvygsd" };
let obj2 = { someKey2: "sdvtglmha" };

for (let key in [obj1, obj2]) {
  console.log(typeof key, key);
}

→ Ссылка
Автор решения: Grundy

Согласно справке: первым передаваемым параметром, является целевой объект, куда будут добавляться свойства, все остальные параметры - это объекты, чьи свойства будут добавляться.

В случае

Object.assign( user, obj1, obj2 );

Происходит передача трех параметров:

  • user - целевой объект
  • obj1 - первый источник
  • obj2 - второй источник

В случае

Object.assign( user, [obj1, obj2] );

Происходит передача двух параметров:

  • user - целевой объект
  • [obj1, obj2] - первый источник

Так как источником является массив - в целевой объект добавляются его свойства 0 и 1, соответствующие каждому элементу массива.

→ Ссылка
Автор решения: Александр Лесив

Массивы в javascript - это тоже объекты, ключами которых являются числа, т.е. запись [obj1, obj2] почти эквивалентна записи {"0": obj1, "1": obj2}, и когда вы пытаетесь объединить объект user и массив [obj1, obj2], то фактически вы пытаетесь объединить user и другой объект с ключами "0" и "1"

→ Ссылка
Автор решения: anti1hero

function shallowCopy(obj) { const res = Object.assign({}, obj); return res }

const myObj = { one: 1, two: 2, three: 3 };

const myObjCopy = shallowCopy(myObj);

console.log(myObjCopy === myObj); // false

→ Ссылка