似乎 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]]
)。
为什么会这样?
最佳答案
因为指针,这就是原因。 Javascript 以这种(而且只有这种)方式取代了 Java 和 C。当你做作业时
largeArr[i] = smallArr
你正在分配一个指针。指针分解:
在 C 中,(在较小程度上,Java 和 Javascript)你没有基本的数组类型 - 相反,数组指向内存中的一个空间,你可以用你想要的任何信息填充那个空间(或者更确切地说,你已经宣布了)。指针在内存中的存在方式?四(或八,或两个,取决于您的系统)字节内存地址,它告诉编译器/解析器从哪里获得适当的信息。所以,当你在那里做那个赋值时,你是在告诉它:“嘿,设置 largeArr[i] 等于 smallArr 的内存地址。”因此,当您对 smallArr 进行更改时,它会在您每次取消引用数组时反射(reflect)出来——因为它实际上是同一个数组。但是当你这样做时:
smallArr = []
在循环内,你说,“创建一个新数组,并将 smallArr 设置为该数组的地址。”这样,数组就会保持独立。
关于javascript - 在 "for"循环中填充多维数组 (javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13692488/