提问者:小点点

拼接方法正在影响上一个对象值。 为什么? [副本]


我正在尝试下面的代码,但是它的行为很奇怪。

代码:

const a = [{ x: 'c', y: 'z' }, { x: 'd' }];

const b = a[0];
b.x = 'dx';

a.splice(1, 0, b)

console.log(a)

输出:

[{x: "dx", y: "z"},{x: "dx", y: "z"}, {x: "d"}]

但我想:

[{x: "c", y: "z"},{x: "dx", y: "z"}, {x: "d"}]

请帮帮我!


共3个答案

匿名用户

const b = a[0];

这不会生成对象的副本。 它只是创建一个对同一对象的新引用。 所以当您在下一行修改对象时:

b.x = 'dx';

。。。单个对象现在有了一个新的x属性。 您对该对象的两个引用都将“看到”这一变化,因为它们都指向同一个对象。

如果你想要两个不同的对象,你需要做一个拷贝。 对于您的情况,浅层复制就足够了(浅层的意思是只复制顶级属性)。 使用扩展语法:

const b = { ...a[0] }

或者使用Object.Assign(在将扩展语法添加到语言之前,这是一种方法):

const b = Object.assign({}, a[0]);

匿名用户

您正在通过引用访问对象,因此您正在从访问对象的任何地方更改对象本身。。。

https://codeburst.io/expilling-value-vs-reference-in-javascript-647a975e12a0

如果你想用相同的值创建一个克隆数组,最简单的方法是

const clone = [ ...original ]  

匿名用户

只需将其更改为下面的代码

const a = [{ x: 'c', y: 'z' }, { x: 'd' }];

const b = {x: a[0].x, y: a[0].y};
b.x = 'dx';

a.splice(1, 0, b)

console.log(a)