兄弟们想问一个 JS 里 new Array()的问题

2021-05-09 19:39:59 +08:00
 HariopaNic

今天小弟做到 leetcode 的 62 题

var uniquePaths = function (m, n) { // let grid = Array.from(new Array(m), () => new Array(n).fill(1)); let grid = new Array(m).fill(new Array(n).fill(1)) console.log('第一个 log',grid) for (let i = 1; i < m; i++){ for (let j = 1; j < n; j++){ grid[i][j] = grid[i - 1][j] + grid[i][j - 1]; } }; console.log('第二个 log',grid); return grid.pop().pop(); }; niquePaths(7,3);

先上一下代码,这里我想创造一个 m*n,每一项都是 1 的数组,所以用到了 new Array(m).fill(new Array(n).fill(1)); 在第一个 Log 里打印出来的是 [ [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ] ]; OK,正好是我想要的 但是在最后的结果里这个 grid 的数值变成了 [ [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ], [ 1, 7, 28 ] ]; 这完全不符合我的逻辑啊 于是看了一下别人代码,用另外一种方法创造数组: let grid = Array.from(new Array(m), () => new Array(n).fill(1));

最后的结果是 [ [ 1, 1, 1 ], [ 1, 2, 3 ], [ 1, 3, 6 ], [ 1, 4, 10 ], [ 1, 5, 15 ], [ 1, 6, 21 ], [ 1, 7, 28 ] ]; 这个答案是我想要且正确的 难道是第一步创造数组的时候出现了问题? 可在第一个 log 里打出来的 grid 都是 [ [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ] ]; 为什么后面会变化呢? 难道涉及到了我不知道的知识点么 有 JS 大佬讲解下么

1765 次点击
所在节点    JavaScript
7 条回复
HariopaNic
2021-05-09 19:44:25 +08:00
日 主楼在手机上看怎么这么乱 对不住了大家
2kCS5c0b0ITXE5k2
2021-05-09 20:01:00 +08:00
```
var uniquePaths = function (m, n) {
// let grid = Array.from(new Array(m), () => new Array(n).fill(1));
let grid = new Array(m).fill(new Array(n).fill(1))
console.log('第一个 log',grid)
for (let i = 1; i < m; i++){
for (let j = 1; j < n; j++){
grid[i][j] = grid[i - 1][j] + grid[i][j - 1];
}
};
console.log('第二个 log',grid);
return grid.pop().pop();
};
niquePaths(7,3);
```
des
2021-05-09 20:02:30 +08:00
item = new Array(n).fill(1)
grid = new Array(m).fill(item)

因为 item 都是同一个,也就是说 grid[x]都是同一个
HariopaNic
2021-05-09 20:10:07 +08:00
@emeab 学会了 谢了兄弟
HariopaNic
2021-05-09 20:10:17 +08:00
@des 恍然大悟 谢谢了!
Pastsong
2021-05-09 20:14:34 +08:00
new Array(n).fill(object) 实际上是把同一个 object 的引用赋值给所有 index,改其中一个 index 其实是改了引用的那个 object 。fill 原始值( primitive values )是 ok 的是因为 js 里原始值都是值引用。
HariopaNic
2021-05-09 20:21:07 +08:00
@Pastsong 谢谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX