Странное поведение Object.assign - PullRequest
0 голосов
/ 17 января 2019

Недавно я попытал счастья с помощью Spread Syntax в JavaScript, где результаты были достаточно странными и сумасшедшими, чтобы опубликовать этот вопрос. Мои предположения о синтаксисе распространения в том, что он похож на Object.assign(), но будет ли он меняться в зависимости от переменных той же природы?

a = {a: "a"};
b = {b: "b"};
c = {c: "c"};
d = {d: {e: "e"}};

d = Object.assign(a, b, c, d);
e = { ...a, ...b, ...c, ...d };

console.log("Before Variable Change");
console.log(d);
console.log(e);

a.a = "s";
b.b = "t";
d.d.e = "f";

console.log("After Variable Change");
console.log(d);
console.log(e);
.as-console-wrapper {max-height: 100% !important; height: 100% !important;}

В результате я получил:

Before Variable Change
{
  "a": "a",
  "b": "b",
  "c": "c",
  "d": {
    "e": "e"
  }
}
{
  "a": "a",
  "b": "b",
  "c": "c",
  "d": {
    "e": "e"
  }
}
After Variable Change
{
  "a": "s",
  "b": "b",
  "c": "c",
  "d": {
    "e": "f"
  }
}
{
  "a": "a",
  "b": "b",
  "c": "c",
  "d": {
    "e": "f"
  }
}

Я мог бы понять, что значение d.e всегда будет меняться из-за его "объектной" природы, и они изменчивы, поэтому приняты. Но когда я попытался использовать синтаксис ... с этим, изменилось первое значение объекта (a.a), но не второе (b.b) . Я что-то здесь упускаю?


Дополнительная информация:

Проверено в браузерах:

  • Chrome на macOS, версия 71.0.3578.98 (официальная сборка) (64-разрядная версия)
  • Chrome в Windows, версия 70.0.3538.110 (официальная сборка) (32-разрядная версия)

1 Ответ

0 голосов
/ 17 января 2019

Функция Object.assign() изменяет содержимое первого параметра объекта, который равен a. Это также возвращаемое значение, поэтому после первого вызова Object.assign(), который устанавливает значение d, будет истинно, что d === a.

Таким образом, присвоение "s" a.a также изменит d.a, поскольку d и a ссылаются на один и тот же объект.

Просто добавив два моих цента, простым способом:

Другими словами, оператор распространения делает это:

d = Object.assign({}, a, b, c, d);
e = { ...a, ...b, ...c, ...d };

Теперь оба вышеупомянутых одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...