[英]Weird behaviour of Object.assign
我最近在JavaScript中尝试使用Spread Syntax,结果很奇怪,也很疯狂,可以发布这个问题。 我对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); aa = "s"; bb = "t"; dde = "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"
}
}
我可以理解de
的价值总会因其“对象”性质而改变,而且它们是可变的,所以被接受。 但是当我尝试使用...
spread语法时, 对象的第一个值被改变( aa
)而不是第二个( bb
) 。 我在这里错过了什么吗?
额外信息:
用浏览器检查:
Object.assign()
函数更改第一个对象参数的内容,即a
。 那也是返回值,所以在第一个设置d
值的Object.assign()
调用之后, d === a
就是真的。
因此,将“s”分配给aa
也将改变da
因为d
和a
引用相同的对象。
只需添加我的两分钱,简单一点:
换句话说,扩展运算符执行此操作:
d = Object.assign({}, a, b, c, d);
e = { ...a, ...b, ...c, ...d };
现在两者都是一样的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.