V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
HariopaNic
V2EX  ›  JavaScript

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

  •  
  •   HariopaNic · 2021-05-09 19:39:59 +08:00 · 1766 次点击
    这是一个创建于 1329 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天小弟做到 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 大佬讲解下么

    7 条回复    2021-05-09 20:21:07 +08:00
    HariopaNic
        1
    HariopaNic  
    OP
       2021-05-09 19:44:25 +08:00 via iPhone
    日 主楼在手机上看怎么这么乱 对不住了大家
    2kCS5c0b0ITXE5k2
        2
    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
        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
        4
    HariopaNic  
    OP
       2021-05-09 20:10:07 +08:00
    @emeab 学会了 谢了兄弟
    HariopaNic
        5
    HariopaNic  
    OP
       2021-05-09 20:10:17 +08:00
    @des 恍然大悟 谢谢了!
    Pastsong
        6
    Pastsong  
       2021-05-09 20:14:34 +08:00
    new Array(n).fill(object) 实际上是把同一个 object 的引用赋值给所有 index,改其中一个 index 其实是改了引用的那个 object 。fill 原始值( primitive values )是 ok 的是因为 js 里原始值都是值引用。
    HariopaNic
        7
    HariopaNic  
    OP
       2021-05-09 20:21:07 +08:00
    @Pastsong 谢谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1958 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:58 · PVG 08:58 · LAX 16:58 · JFK 19:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.