Javascript For循环创建无限对象树

Javascript For循环创建无限对象树,javascript,arrays,object,for-loop,Javascript,Arrays,Object,For Loop,我有两个用于创建对象的循环: function newImage(){ image = {}; var temp = {} for(i=0;i!=250;i++){ temp[i] = {}; } image = temp; for(i=0;i!=250;i++){ image[i] = temp; } } 这将创建一个具有250个值的对象,每个值都是一个包含250个对象的对象。但是,它会创建一个对象,创建

我有两个用于创建对象的循环:

function newImage(){
    image = {};
    var temp = {}
    for(i=0;i!=250;i++){
        temp[i] = {};
    }
    image = temp;
    for(i=0;i!=250;i++){
        image[i] = temp;
    }
}
这将创建一个具有250个值的对象,每个值都是一个包含250个对象的对象。但是,它会创建一个对象,创建250个值,用250个值填充这些值,并循环一段时间。我还没有找到树的尽头,但它并没有冻结,这让我相信它是有限的。我已经检查了多达50次的迭代,它一直工作(它不会生成长树)。它似乎是在最后一次迭代中发生的

上面的几行创建了一个对象,并用250个其他对象填充它(到目前为止还不错)

然后
image=temp将图像(全局)变量设置为
temp
(因此图像现在包含250个对象),然后:

这将使用对父对象的引用替换这250个对象中的每一个(覆盖以前的指定),以便该对象具有250个属性,所有属性都引用自身

实际上你写的是:

image = {};
for ( var i = 0; i < 250; i++ )
    image[i] = image;
image={};
对于(变量i=0;i<250;i++)
图像[i]=图像;
然后,看起来你有一个无限的对象树,而你只有一个对象,它有许多指向它自己的属性,所以每当你下降到一个子对象,你就会回到父对象(在浏览器中展开对象层次结构,使其看起来像一棵无限树,而实际上它只是一遍又一遍地显示同一对象)

你可能想写的是:

function newImage(){
    var temp = {};
    for( var i=0; i < 250; i++){
        temp[i] = {};
        for( var j=0; j<250; j++){
           temp[i][j] = {};
        }
    }
    return temp;
}
函数newImage(){
var temp={};
对于(变量i=0;i<250;i++){
温度[i]={};

对于(var j=0;j您的问题是,当您将
image
指定给
temp
时,对这些对象的任何进一步编辑都会反映在另一个对象上

请尝试以下代码:

function newImage(){
    image = {};
    var temp = {}
    for(i=0;i!=250;i++){
        temp[i] = {};
    }
    for(var item in temp){
        image[item] = temp[item];
    }
    for(i=0;i!=250;i++){
        image[i] = temp;
    }
}

嗯,很奇怪。它应该停在
i=250
。但是可能
i
在其他地方被改变了,它偷偷地超过了250?通常,为了安全起见,人们将循环条件写为
i<250
。哦,好吧。我这么做了,但它很早就停了。但这不是问题。它做得正确,但它做得无限正确。Looks like
var temp={}
缺少
@asimes,但这不会有什么区别。好吧,你做错了。你告诉循环在无限时间内添加一些东西,不包括第250个索引处的对象谢谢你解释这个问题!:)回答得很好。@Fuzzyzilla,如果你想多读一点关于这个问题的内容,我就写了。如果你改变
image[x]
,那么你也在改变
image[y]
,因为它们是同一个对象——这可能不是OP想要的。
function newImage(){
    var temp = {};
    for( var i=0; i < 250; i++){
        temp[i] = {};
        for( var j=0; j<250; j++){
           temp[i][j] = {};
        }
    }
    return temp;
}
function newImage(){
    image = {};
    var temp = {}
    for(i=0;i!=250;i++){
        temp[i] = {};
    }
    for(var item in temp){
        image[item] = temp[item];
    }
    for(i=0;i!=250;i++){
        image[i] = temp;
    }
}