Object.assign的怪异行为

时间:2019-01-17 13:42:05

标签: javascript object assignment-operator spread-syntax

我最近在JavaScript中尝试了Spread Syntax的运气,结果奇怪又疯狂,足以发布此问题。我对价差语法的假设是,它类似于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 。我在这里想念东西吗?


其他信息:

已通过浏览器检查:

  • 在macOS上的Chrome,版本71.0.3578.98(正式版本)(64位)
  • Windows上的Chrome,版本70.0.3538.110(正式版本)(32位)

1 个答案:

答案 0 :(得分:2)

Object.assign()函数更改第一个对象参数a的内容。这也是返回值,因此在第一次设置Object.assign()的{​​{1}}调用之后,d就成立了。

由于d === aa.a引用相同的对象,因此将{s}分配给d.a也会更改d

只需简单地加上我的两分钱即可:

换句话说,价差运算符执行以下操作:

a

现在以上两个都相同。