我正在尝试下面的代码,但是它的行为很奇怪。
代码:
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"}]
请帮帮我!
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)