Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 拼接方法正在影响上一个对象值。为什么?_Javascript_Typescript - Fatal编程技术网

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代替感谢。回答得很好。再次感谢。。。