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

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

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

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

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

输出:

我们只想给arr[0][0]赋值,但是每一行数组为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))
相关推荐
孩子 你要相信光几秒前
css之一个元素可以同时应用多个动画效果
前端·css
萌萌哒草头将军2 分钟前
Oxc 和 Rolldown Q4 更新计划速览!🚀🚀🚀
javascript·vue.js·vite
huangql52012 分钟前
npm 发布流程——从创建组件到发布到 npm 仓库
前端·npm·node.js
Qlittleboy26 分钟前
uniapp如何使用本身的字体图标
javascript·vue.js·uni-app
Days205027 分钟前
LeaferJS好用的 Canvas 引擎
前端·开源
小白菜学前端42 分钟前
vue2 常用内置指令总结
前端·vue.js
林_深时见鹿43 分钟前
Vue + ElementPlus 自定义指令控制输入框只可以输入数字
前端·javascript·vue.js
GDAL44 分钟前
Knockout.js 任务调度模块详解
javascript·knockout
椒盐螺丝钉44 分钟前
Vue组件化开发介绍
前端·javascript·vue.js
koooo~1 小时前
v-model与-sync的演变和融合
前端·javascript·vue.js