【发布时间】:2012-11-21 11:08:17
【问题描述】:
似乎 JavaScript 试图以某种方式优化代码,所以如果我们想在循环中用改变的一维数组 (smallArr) 的值填充多维数组 (largeArr) 并使用以下代码:
largeArr = []
smallArr = []
for (i=0; i<2; i++)
{
smallArr[0]=i
smallArr[1]=2*i
largeArr[i]=smallArr
}
我们得到了一个意想不到的结果:largeArr=[[1,2],[1,2]](必须是[[0,0],[1,2]])。因此,Javascript 首先计算smallArr 值,然后才填充largeArr。
为了得到正确的结果,我们必须在循环中声明smallArr:
largeArr = []
for (i=0; i<2; i++)
{
smallArr = []
smallArr[0]=i
smallArr[1]=2*i
largeArr[i]=smallArr
}
然后它按预期工作(largeArr=[[0,0],[1,2]])。
为什么会这样?
【问题讨论】:
-
在第一种情况下,对数组的相同引用被插入到 largeArr 中,因此第二次循环修改只会修改单个实际数组的内容,其引用在 largeArr 中插入两次.
-
在测试这样的代码以使用开发人员工具在 javascript 中插入断点时,它可能会对您有所帮助。这样您就可以看到结果不是由于优化造成的,但如果您不知道指针是什么,我想它仍然会令人难以置信。
标签: javascript arrays optimization for-loop multidimensional-array