【发布时间】:2019-05-18 14:56:15
【问题描述】:
const nestedArr = [];
// ADD CODE HERE
let arr = [];
for(let i=0; i<5; i++){
arr.push(`loop${i}`, i);
nestedArr.push(arr);
// nestedArr.push([`loop${i}`, i]);
}
console.log(nestedArr)
大家好,我只是想知道一些我不理解的 JS 行为。使用灰色注释行 // nestedArr.push([loop${i}, i]); 解决了挑战,但是当我尝试使用未注释的其他方法时
arr.push(`loop${i}`, i);
nestedArr.push(arr);
不像我想的那样工作。
方法是首先声明一个数组arr,然后每5次迭代将字符串loop${i}和第二个元素索引i推送给它。接下来在 5 次迭代中将数组 arr 推入 nestedArr。预期结果应该将 arr 推送 5 次到 nestedArr 中,每次推送都应该在 arr 中一次添加一个元素。但是,正如您所见,推送的子数组 arr 都被推送了 5 个元素,每次 5 次。当 i 为 0 时,我期待第一次迭代,子数组 arr 被推送到 nestedArr 以仅包含一个元素,但已与其他子数组保持 5 相同。
[['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4]]
预期的结果应该是
[['loop0', 0], ['loop1', 1], ['loop2', 2], ['loop3', 3], ['loop4', 4]]
每次迭代时在子数组 arr 中添加一个元素,然后在 5 次迭代期间将其推送到 nestedArr。 知道为什么吗?
【问题讨论】:
-
您正在
nestedArr内部推送arr的引用,并将项目添加到arr。因此,结果将是一个包含 5 个arr引用的数组,指向内存中的同一个数组(因此是结果)。对于预期的结果,只需将arr声明移动 inside 循环,以便每次都重新声明它并且推送到nestedArr的引用将始终指向内存中的不同数组(因此5 个不同的数组)。 -
这是有道理的@briosheje,没想到这让我很困惑。感谢您的反馈!
-
不客气。作为一般规则,请记住,除了原始类型之外的所有类型都是通过引用传递的,因此数组和对象在 javascript 中总是通过引用传递。跟踪您的变量并记住即使是日志也是通过引用工作的,因此在循环时记录您的数组仍然会每次都记录相同的记录。
-
我知道这是一个很棒的提示!谢谢!!
标签: javascript arrays for-loop multidimensional-array sub-array