Reactjs 为什么当我在TS中更改对象的副本时,原始副本也会更改?

Reactjs 为什么当我在TS中更改对象的副本时,原始副本也会更改?,reactjs,typescript,redux,Reactjs,Typescript,Redux,我正在导入redux store并使用spread操作符创建store属性的副本。然后,当我更改此副本时,原始属性也会更改 当我使用copy=JSON.parse(JSON.stringify(original))时,一切正常 export const move = (moveData: IMove): BoardActionTypes => { const { board } = store.getState(); console.log(board.pieces.byId["1

我正在导入redux store并使用spread操作符创建store属性的副本。然后,当我更改此副本时,原始属性也会更改

当我使用
copy=JSON.parse(JSON.stringify(original))
时,一切正常

export const move = (moveData: IMove): BoardActionTypes => {
  const { board } = store.getState();
  console.log(board.pieces.byId["19"]); // {row: 3, col: 7}

  const newById: IPiecesById = { ...board.pieces.byId };

  newById["19"].col = 4;
  newById["19"].row = 4;

  console.log(board.pieces.byId["19"]); // {row: 4, col: 4}
  console.log(newById["19"]); // {row: 4, col: 4}

  //...
};

我有两个选择

1。使用
下划线.js

var foo={row:0,col:0};
变量条=u2;克隆(foo);
bar.row=99;
console.log(foo);
控制台日志(bar)

我有两个选择

1。使用
下划线.js

var foo={row:0,col:0};
变量条=u2;克隆(foo);
bar.row=99;
console.log(foo);
控制台日志(bar)

您的问题是关于对象的浅拷贝与深拷贝

使用“扩展”操作符时,您可以创建对象的浅层副本(就像使用“旧样式”时一样)

当您使用JSON解析时,您会得到对象的深层副本(或“深层克隆”)

顾名思义,浅复制意味着外部对象是新对象,而嵌套对象保持不变。一旦您深入了解了redux,speard操作符在大多数情况下应该已经足够了,但要记住这是一个重要的区别


您可能还想阅读。

您的问题是关于对象的浅拷贝与深拷贝

使用“扩展”操作符时,您可以创建对象的浅层副本(就像使用“旧样式”时一样)

当您使用JSON解析时,您会得到对象的深层副本(或“深层克隆”)

顾名思义,浅复制意味着外部对象是新对象,而嵌套对象保持不变。一旦您深入了解了redux,speard操作符在大多数情况下应该已经足够了,但要记住这是一个重要的区别


您可能还想阅读。

发生在您身上的是-两个具有相同引用的对象

如果您不想使用外部库或帮助器函数(如果您不打算广泛使用它),可以使用如下内容:

const newById = board.pieces.byId.map((item) => ({ ...item }));

(我假设byId是一个数组,map创建了一个新数组)

发生在您身上的是-两个具有相同引用的对象

如果您不想使用外部库或帮助器函数(如果您不打算广泛使用它),可以使用如下内容:

const newById = board.pieces.byId.map((item) => ({ ...item }));
(我假设byId是一个数组,map创建了一个新数组)