我正在尝试以下代码,但它的行为很奇怪。
代码:
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)