关于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函数会保存执行结果吗?不是太理解
万望解惑

阅读 2k
3 个回答

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

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

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

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

代码等同于

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

明白没?

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题