利用new Array().fill()创建二维数组出错:
提示:这里简述项目相关背景:
创建一维数组的时候有两种方式:
- 用字面量
let dp=[]
- 用new Array(),
let dp=new Array(5)
得到长度为5的数组。
两者的区别在于第二种方式可以指定数组的长度。再通过数组的fill()
方法填充数组为指定内容。
fill()填充的内容是什么
实际上fill()
填充的是“值”。这意味着你填充基本类型的数据时是ok的,比如
let dp= new Array(3).fill('ok')//['ok','ok','ok',]
如果你填充的是引用类型的数据,那就有问题了,比如
let dp = new Array(3).fill([])//[[],[],[]]
let dp1 = new Array(2).fill(new Array(2).fill(0))//[[0,0],[0,0]]
貌似没什么问题,dp是一个31的数组,dp1是一个22初始化为全零的数组。
但问题在于,当你想改变dp,dp1中某个下标对应的值时,整个数组将全部改变,而不是指定的那个下标。原因在于此时fill(value)
value指的是引用类型的地址,所用的数组将指向同一个地址,使得在修改某个数组时,所有的数组都改变了。
dp[2][0]=4;
console.log(dp)//[[4],[4],[4]]
dp1[1,1] = 6;
console.log(dp1)//[[0,4],[0,4]]
生成二维数组
所以想生成二维数组,还是得一个个的遍历,不能偷懒。
let dp=[];
for(var i =0;i<text1.length;i++){
dp[i] = new Array(text2.length).fill(0);
}