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 likevar 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;
}
}