我最近在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","d": {
"e": "e"
}
}
After Variable Change
{
"a": "s","d": {
"e": "f"
}
}
{
"a": "a","d": {
"e": "f"
}
}
我可以理解d.e的价值会因为其“对象”的性质而总是变化,并且它们是可变的,因此被接受.但是,当我尝试使用…扩展语法时,对象的第一个值被更改(a.a),但第二个值没有更改(b.b).我在这里想念什么吗?
额外信息:
通过浏览器检查:
> macOS上的Chrome,版本71.0.3578.98(正式版)(64位)
> Windows上的Chrome,版本70.0.3538.110(正式版本)(32位)
最佳答案
object.assign()函数更改第一个对象参数a的内容.这也是返回值,因此在第一个设置d值的object.assign()调用之后,d === a是正确的.
原文链接:https://www.f2er.com/js/531107.html因此,将“ s”分配给a.a也将更改d.a,因为d和引用相同的对象.
只需以简单的方式加上我的两分钱:
换句话说,价差运算符执行以下操作:
d = Object.assign({},a,...d };
现在以上两个都相同.