JS new Array.fill(new Array()) 创建二维数组 fill方法的坑

  我们通常会通过如下方式来创建一个二维数据:

javascript 复制代码
const arr = new Array(5).fill(new Array(2).fill(0))

  我们如果想要修改其中一个元素的值

javascript 复制代码
arr[0][0] = 1

输出:

  我们只想给arr00赋值,但是每一行数组为0的下标元素的值全部改变了,这是为什么呐?

原因:

  当fill()的参数是一个引用类型的数据时,并不是将它的值填充到数组,而是将它的地址填充到数组,那么等于把这个数据的地址给了arr的每一项,相当于每一行都指向同一个数组地址,那么当你在操作任意一个位置的值时,所有行都会跟着变化。

解决方法:

1.for循环填充行

javascript 复制代码
let arr = new Array(5)
for (let i = 0; i < 5; i++) {
    arr[i] = new Array(2).fill(0)
}

2.Array.from()

javascript 复制代码
const arr = Array.from(new Array(5).fill(), () => new Array(2).fill(0))

3.数组的map方法

javascript 复制代码
let arr = new Array(5).fill(0).map(item=>new Array(2).fill(0))
相关推荐
用户9385156350714 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
CodeSheep14 小时前
稚晖君公司人事大变动,来了!
前端·后端·程序员
鱼樱前端14 小时前
用 AI 做内容变收入
前端·人工智能·ai编程
eric-sjq14 小时前
10 分钟实战:用 0.6B 本地模型生成中文网页(WanlyFrontend + 编译器全流程)
javascript·机器学习·自然语言处理·html
浮生望14 小时前
React + TypeScript 组件设计进阶:从类型约束到无状态组件的三次进化
前端
To_OC15 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
90后的晨仔15 小时前
Mac 开发 uni-app 终极方案:让安卓模拟器彻底脱离 Android Studio 独立运行
前端·vue.js
90后的晨仔15 小时前
别再搞混了!uni-app 中 node_modules 和 uni_modules 到底是什么关系?
前端
kyriewen16 小时前
面试官问"这段逻辑为什么这样写"——我才发现,这半年我写的代码,我自己都解释不了
前端·javascript·面试
谢小飞16 小时前
大文件上传很难?学会这招,GB文件秒传不是梦
前端·node.js