为什么 Object.assign 的行为与常规引用不同?

Why does Object.assign behave differently from regular references?

提问人:radek79 提问时间:1/24/2022 更新时间:1/24/2022 访问量:31

问:

如果我像第一个例子一样对一个对象进行简单的引用,那么我理解它的方式是 x.a 和 y.a 指向同一个地址,该地址的值为 1。当我将该地址的值更改为 2 时,x 和 y 中的值都会发生变化。

但在第二个示例中,我使用 Object.assign 来创建 y。 x 和 y 是不同的引用,但 x.a 和 y.a 都指向同一个地址。那么为什么当我改变x.a时,y.a在这种情况下没有改变呢?

// simple reference
var x = {a:1};
var y = x;
console.log(x === y); // true
console.log(x.a === y.a) // true
x.a = 2;
console.log(y.a); // 2

console.log('end first example');

// same example but with Oject.assign
var x = {a:1};
var y = Object.assign({}, x);
console.log(x === y); // false
console.log(x.a === y.a); // true, x.a and y.a point to the same address
x.a = 2;
console.log(y.a); // 1, I was expecting this to be 2

JavaScript 引用 克隆 Pass-by-Reference Pass-by-value

评论

2赞 evolutionxbox 1/24/2022
在第一个示例中,指向与 do 相同。在第二种情况下,值恰好是相同的(它们不是“共享”的)。两者都具有 价值 。yxx.ay.a2
1赞 pilchard 1/24/2022
基元值不是通过引用分配的
0赞 evolutionxbox 1/24/2022
x = { a: { b: 2 } }; y = Object.assign({}, x); x.a.b = 1;将向您显示与您期望的结果相似的结果。另请参阅 JavaScript 中没有可用的“通过引用传递”
1赞 Randy Casburn 1/24/2022
甚至更简单:意志是;演示比较基元值x = { a: 2 }; y = {a:2};x.a == y.atrue
0赞 radek79 1/24/2022
@RandyCasburn这是有道理的。所以让我看看我是否做对了。在第二个示例中,x.a === y.a 为 true,因为我们正在比较基元。x.a === y.a 也是正确的,因为我们正在比较原语,(检查我对此的理解)即使 x.a 和 y.a 碰巧指向同一个地址。因此,在这两种情况下,“===”都比较了原语,尽管在第一个示例中,x.a 和 y.a 的地址是相同的,但在第二个示例中它们不是。然后,您如何检查一个引用是否与另一个引用相同,而不执行这些类型的示例并检查值是否更改?

答: 暂无答案