我最近在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
) 。我在这里想念东西吗?
其他信息:
已通过浏览器检查:
答案 0 :(得分:2)
Object.assign()
函数更改第一个对象参数a
的内容。这也是返回值,因此在第一次设置Object.assign()
的{{1}}调用之后,d
就成立了。
由于d === a
和a.a
引用相同的对象,因此将{s}分配给d.a
也会更改d
。
只需简单地加上我的两分钱即可:
换句话说,价差运算符执行以下操作:
a
现在以上两个都相同。