【问题标题】:For loop creating infinite object treeFor循环创建无限对象树
【发布时间】:2015-07-08 23:53:14
【问题描述】:

我有 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.

【问题讨论】:

  • 嗯,很奇怪。它应该停在i = 250。但也许 i 正在其他地方被更改并且它偷偷超过 250?通常,为了安全起见,人们将循环条件写为i < 250
  • 哦,好的。我确实这样做了,但它很早就停止了。但这不是问题。它正确地做到了这一点,但它无限地正确地做到了。
  • 看起来var temp = {} 不见了;
  • @asimes 不过应该没什么区别。
  • 你做错了。你告诉循环在你的循环无限时间内添加一些东西,不包括第 250 个索引处的对象

标签: javascript arrays object for-loop


【解决方案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;
}

【讨论】:

  • 感谢您对问题的解释! :)
  • 优秀的答案。 @Fuzzyzilla,如果你想了解更多关于这个问题的信息,我写了here
【解决方案2】:

您的问题是,当您将 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;
    }
}

【讨论】:

  • 如果你改变了image[x],那么你也改变了image[y],因为它们是同一个对象——这可能不是OP想要的。
猜你喜欢
  • 2012-03-16
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多