javascript - JavaScript 数组中的对象神秘地链接在一起

标签 javascript

我有以下代码。当我访问 w[1][0] 时,我只想更改该位置处的对象。然而,所有的对象都发生了变化。我假设这是因为在某种程度上,它们都指向同一个对象。我该如何解决这个问题?

 var createArray = function(dim,init){//takes an array of dimensions and the initial value of each element
    if(dim.length > 0){
        var x = new Array();
        for(var i = 0; i < dim[0]; i++)
            x[i] = createArray(dim.slice(1),init)
        return x;
    }
    return init;
}

var w = createArray([2,2],{top: false,left: false});
console.log(w);
w[1][0].left = true;
console.log(w);

最佳答案

在 JavaScript 中,对象是通过引用传递的,而不是通过传递的。这意味着如果将同一个对象传递给几个变量,它们都指向内存中的同一位置。这就是为什么你的 init 对象到处都在改变。

为了防止这种情况,您需要在将对象分配给变量之前克隆该对象。最简单的内置方法之一是使用 JSON,如下所示:

var copy = JSON.parse(JSON.stringify(original));

所以在你的情况下就是这样:

x[i] = createArray(dim.slice(1), JSON.parse(JSON.stringify(init)));

关于javascript - JavaScript 数组中的对象神秘地链接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31751754/

相关文章:

javascript - Reflect.construct 让我们做了哪些以前做不到的事情?

javascript - Angular 组件每 X 秒刷新一次页面数据

javascript - 在 Kendo UI Treeview Drop 事件中确认

javascript - 未定义不是有效函数上的函数

javascript - RequireJS 随机中断

javascript - Jquery:如何将动态按钮与动态div绑定(bind)?

javascript - 如何在不使用jquery或触摸事件的情况下在移动设备中实现触摸?

javascript - 如何在类组件 React 之外访问 Prop

javascript - 如何将表单中的 Json 发布到 Controller 然后保存到数据库

Javascript - 向回调函数添加更多参数