【发布时间】:2019-02-28 23:41:25
【问题描述】:
此处代码:https://codesandbox.io/s/github/nieroda/js_err
在函数 endTurn 中
console.log(`GameBoard Before`)
console.log(gameBoardCopy)
gameBoardCopy[currentRow][4] = { numColorMatch: 2, numExactMatch: 2 }
console.log(`GameBoard After`)
console.log(gameBoardCopy)
查看控制台输出
Before:
5: Array(5)
0: "BlueViolet"
1: "BlueViolet"
2: "BlueViolet"
3: "BlueViolet"
4: {numColorMatch: 0, numExactMatch: 0}
After
5: Array(5)
0: "BlueViolet"
1: "BlueViolet"
2: "BlueViolet"
3: "BlueViolet"
4: {numColorMatch: 0, numExactMatch: 0}
我不知道为什么它不起作用?
【问题讨论】:
-
请在问题本身中包含minimal reproducible example。
-
看看this question。这可能会有所帮助。 (我看到第 1 行让您将一个对象分配给另一个变量并将其称为“副本”,但因为分配是“按引用”而不是“按值”,我认为这不会像您认为的那样 - 两者"copy" 和 original 仍然是同一个对象,你只是给了它两个不同的名字。)
-
尝试制作对象的深层副本 - 分配仍然不起作用@GarrettMotzner
-
这里发生了一些疯狂的突变问题 :)。当我使用调试器单步执行时,结果与我没有设置断点时不同。因此,控制台及其记录数据的时间点也存在时间问题。这很奇怪。所以数据正在被设置,然后它被变异了。
-
好吧,所以你在很多地方都发生了突变,其中之一就是提示块,当你遍历钉子时,你正在改变一个数据结构。即使固定了,仍然存在突变。因此,为了帮助防止这种情况发生,我建议使用Immutable.js。这为您提供了替代的不可变列表而不是数组和不可变映射而不是对象,这样您就不会意外地改变事物。不过,这是另一回事……
标签: javascript reactjs flow