我有2个for循环创建一个对象:
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次的迭代,它一直工作(它没有制作长树)。看起来好像是在最后一次迭代中发生的。 Here's the full thing.
答案 0 :(得分:1)
var temp = {}
for(i=0;i!=250;i++){
temp[i] = {};
}
上面的行创建了一个对象,并用250个其他对象填充它(到目前为止一直很好)。
然后image = temp;
将图像(全局)变量设置为temp
(因此图像现在包含250个对象)然后:
for(i=0;i!=250;i++){
image[i] = temp;
}
这将使用对父对象的引用替换这250个对象中的每一个(覆盖先前的赋值),因此对象具有250个属性,这些属性都引用自身。
你写的有效的是:
image = {};
for ( var i = 0; i < 250; i++ )
image[i] = image;
然后看起来你有一个无限的对象树,而你只有一个对象,它有许多引用自身的属性,所以每当你下降到一个孩子时你最终回到父对象(并扩展对象层次结构)浏览器使它看起来是一个无限的树,当它实际上只反复显示同一个对象时。
你可能想写的是:
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;
}
答案 1 :(得分:0)
您的问题是,当您将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;
}
}