Array.fill和Array.map好像不太一样,用的时候要谨慎

今天写算法题,遇到了一个小坑,是有关于创建二维数组的,mark一下

怎么创建二维数组

我一般是用Array.fill,比如我们要创建一个m行n列的二维数组,我一般是这样写的:

var dp=Array(m).fill(Array(n).fill(0));

但是在今天的算法题里面,我发现即便我的逻辑是对的,但是最后结果还是不太对,我看了下力扣大神们的写法:

var dp2=Array(m).fill().map(()=>Array(n).fill(0));

我在算法题中把创建二维数组的方式改成了上面大神的这种方式,算法运行成功了,为什么会这样呢,我console.log了一下,发现创建的都是m行n列的数组呀。然后我又判断了一下两者是否相等:

console.log(dp==dp2)

打印出来是false,怎么会这样呢,我立马想到,是不是因为引用不一样的问题,查阅了一下资料果然如此。

Array.fill()

Array.fill()参数是一个引用类型数据的数组的时候,就相当于把这个数据的地址给了arr的每一项,相当于每一行都指向了同一个地址,那么当我们操作任意一个位置的值的时候,所有的行都会跟着变化,每一行的结果注定是一样的,下面举个例子:
首先创建一个3×3的数组

var dp=Array(3).fill(Array(3).fill(0));

输出肯定没问题:

[[0,0,0],[0,0,0],[0,0,0]]

假如我们现在想给第一项赋值为1:

dp[0][0]=1

然后我们发现数组变成了:

[[1,0,0],[1,0,0],[1,0,0]]

每一行的第一列都赋值成了1

正确创建二维数组的方式

  1. for循环
let arr=new Array(m)
for(let i=0;i<m;i++){
	arr[i]=new Array(n).fill(0);}
  1. Array.from()
let arr=Array.from(Array(m),()=>new Array(n).fill(0))
  1. 数组的map方法
let arr=Array(m).fill().map(()=>Array(n).fill(0))

map方法就相当于在数组的每一项里面新建了一个数组
【注意】在这里,不能删除第一个fill(),map方法是对数组中的每个值执行回调函数,数组中必须有值,不然map方法不起作用。fill()不写参数,默认填充undefined;

【题外话】我觉得现在面试对前端工程师的要求太过于苛刻了,当初因为喜欢才去准备这个,越学到后面发现,其实很多工作都不需要前端去做,但是面试都要问,哎,大环境如此,只能加强自身的学习,提升自我竞争力,我觉得不管在哪个行业,做到极致都是无可替代的。为了高效准备秋招,我也开始打算以后开个专栏,专门总结前端八股文了(把牛客网上那些面经都总结下来),如果有时间有精力,我可以整理成pdf(如果没有就算了),希望不要失业把~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李喵喵爱豆豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值