Javascript 拼接方法正在影响上一个对象值。为什么?
我正在尝试以下代码,但它的行为很奇怪 代码:Javascript 拼接方法正在影响上一个对象值。为什么?,javascript,typescript,Javascript,Typescript,我正在尝试以下代码,但它的行为很奇怪 代码: 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",
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 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 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 clone = [ ...original ]
这不会生成对象的副本。它只是创建对同一对象的新引用。因此,当您在下一行修改对象时:
b.x = 'dx';
。。。单个对象现在具有新的x属性。对对象的两个引用都将“看到”此更改,因为它们都指向同一个对象
如果您想拥有两个不同的对象,则需要制作一个副本。对于您的情况,浅复制就足够了(浅复制意味着只复制顶级属性)。或使用:
或者使用Object.assign(这是将扩展语法添加到语言之前的方法):
只需将其更改为以下代码
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)
可以使用“排列”操作符为对象创建新参照:
const b = [
...a[0]
];
这叫“不变性”,查一查 逻辑仍然不清楚。在什么逻辑中需要预期的输出?
a[0]
是对对象的引用。正如前面所说,[0]是引用。如果您想要数组的副本,请执行b=[…a]我想在[0]之后添加一个新对象,并对[0]进行一些修改。我怎么能得到它呢?如果你在谷歌上搜索不变性,你很可能会发现一些不同的东西(你仍然应该阅读这些东西来理解你在做什么)。。。谷歌参考vs价值javascript代替感谢。回答得很好。再次感谢。。。