javascript - 在 "for"循环中填充多维数组 (javascript)

标签 javascript arrays optimization for-loop multidimensional-array

似乎 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/

相关文章:

python - 如何根据先前的解决方案在 Python Gekko 中重新初始化优化

javascript - 谷歌云端硬盘 API : How do I list all files in a shared folder?

javascript - 从 promise 导出数组,但在另一个文件需要时不加载?

javascript - 使用单选按钮组合显示 HTML 元素的逻辑

php按创建日期而不是名称对文件夹进行排序

c++ - 使用 istream_iterators 构造 vector 比使用 string/std::atof 的 while 循环慢,为什么?

c++ - 如何使每帧分支优化友好?

javascript - 防止双击图像映射区域

c++ - 如何在类中有一个二维数组作为私有(private)变量,然后在构造函数中设置

javascript - Array.map是什么概念?