关于javascript的一个面试题

代码如下:

const squares = Array(3).fill(Array(3).fill(null));
squares[0][0] = 1
console.log(squares) 

打印结果是什么?
我开始的答案是:

[[null,null,null],[null,null,null],[null,null,null]]

但是真实答案是:

[[1,null,null],[1,null,null],[1,null,null]]

为什么?难道是fill函数会保存执行结果吗?不是太理解
万望解惑

阅读 330
评论
    3 个回答

    看了这个问题去找了一下 MDN里面 array.fill的用法

    fill 方法是个可变方法, 它会改变调用它的this对象本身, 然后返回它, 而并不是返回一个副本。

    当一个对象被传递给fill方法的时候, 填充数组的是这个对象的引用。

    所以应该都是同一个引用了,借助问题学习了一波~

      • 4.1k

      代码等同于

      var fill = Array(3).fill(null);
      const squares = Array(3).fill(fill);
      fill[0] = 1;
      console.log(squares);

      明白没?

        • 1.2k

        因为Array.fill()如果填充类型为对象,则为浅拷贝。数组内的3个对象指向的都是同一个内存地址。

          撰写回答

          登录后参与交流、获取后续更新提醒