拼接方法正在影响以前的对象值.为什么



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

代码:

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"}]

请帮帮我!

您正在通过引用访问对象,因此您正在从访问对象的任何位置更改对象本身…

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

如果你想制作一个具有相同值的克隆阵列,最简单的方法是

const clone = [ ...original ]  
const b = a[0];

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

b.x = 'dx';

单个对象现在具有一个新的x属性。您对该对象的两次引用都将";参见";这一变化,因为它们都指向同一个对象。

如果你想要两个不同的对象,你需要制作一个副本。对于您的情况,一个浅层副本就足够了(浅层意味着只复制顶级属性(。要么使用排列语法:

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

或者使用Object.assign(这是在将spread语法添加到该语言之前的方法(:

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

您可以使用排列运算符为对象创建新的引用:

const b = [
...a[0]
];

它被称为";不变性";查一下!

只需将其更改为以下代码

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)

最新更新