gpt4 book ai didi

Javascript 混合内存地址? (重置数组不起作用)

转载 作者:行者123 更新时间:2023-12-01 02:02:58 24 4
gpt4 key购买 nike

我已经解决了这个问题,但它需要 O(N) 解决方案。我的解决方案似乎也没有考虑到实际情况。谁能解释一下为什么会发生这种情况?

在我正在编写的一个简单程序中(井字游戏),我有一个“析构函数”函数,可以在游戏重置时重置所有变量。

特别是,我有两个“全局”变量(我知道 block 作用域)。我将其中之一设置为伪静态变量来重置“游戏板”。

var board = [11,12,13,21,22,23,31,32,33];

我用它来跟踪板上占用的空间。

现在,当我重新启动游戏来破坏该函数时,我使用了一个在 as 中初始化的伪静态变量。

var staticBoard = [11,12,13,21,22,23,31,32,33];

因此,当 staticBoard 用于在这样的函数中重置板时,板会更新。

function destructor(){
board = staticBoard;
};

这对于游戏的前几次迭代来说效果很好,但后来将无法更新,并且无论我尝试析构函数多少次,它都会保持不变。

我尝试过这个。board = [];板= staticBoard;。但我会得到同样的结果。最终,我认为 javascript 以某种方式混淆了两个变量的内存地址,因此我没有将它们设置为彼此相等。

function destructor(){
board = [];
staticBoard.forEach(function(element){
board.push(element);
});

这有效,问题消失了。

任何人都可以解释一下这一点,并在可能的情况下展示更好的解决方案吗?

最佳答案

这是因为当您执行 board = staticBoard 时,您没有复制任何数据,您只是分配了对相同数组的引用。简单说明一下:

xs = [1,2,3]
ys = xs
ys[2] = 4
xs //=> [1,2,4]

相反,您应该:

  • 使用 slice 浅复制数组: board = staticBoard.slice(0)
  • 分配给文字数组:board = [11,12,13,21,22,23,31,32,33]

您可能想使用Object.freeze防止 staticBoard 发生突变(但请注意,突变不会出错,只会默默失败):

xs = Object.freeze([1,2,3])
ys = xs.slice(0)
xs[2] = 4
ys[2] = 5
xs //=> [1,2,3]
ys //=> [1,2,5]

但是,浅复制和卡住只能很好地工作,因为数组包含不可变的数字。如果内容是可变的,则效果不佳:

xs = Object.freeze([[1]])
ys = xs.slice(0)
ys[0][0] = 2
xs //=> [[2]]
ys //=> [[2]]

关于Javascript 混合内存地址? (重置数组不起作用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50402651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com