Странное поведение Object.assign
Недавно я попытал счастья с помощью 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 ответ
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 };
Теперь оба вышеперечисленных одинаковы.