js创建二维数组小坑

版权声明:本文为博主原创文章,评论区告知一声,大家随意转载! https://blog.csdn.net/MessageBox_/article/details/84557641

今天在创建一个二维数组时,遇到一个小坑,最后发现是对forEach函数的理解不够深刻导致的bug,特此记录说明。

需求如下:创建一个10 x 10的二维数组

最常规的想法是,进行遍历循环

let item = new Array(10);
for( let i  = 0 ; i < 10; i++ ){
	item[i] = new Array(10);
}

上面的代码完全可以实现这个需求,然而当时的我想着能不能不使用for循环,使用高级一点的forEach进行循环,结果就悲剧了

let item2 = new Array(10);
item2.forEach(function(val, index){
	item2[index] = new Array(10);
});

想法很丰满,结果很骨感。这个item2在控制台打印出来仍旧是一个一维数组,当我尝试在forEach的回调函数中加入console.log语句时,发现这个console语句根本没有执行!!!

无奈之下,老夫前往MDN查阅了这个forEach,这不查不知道啊,一查才发现自己的无知。
下面是MDN查阅的:

在这里插入图片描述

在这里插入图片描述

从描述中我们可以看到,已删除和未初始化的项会被跳过,这也就解释了为什么我们的回调函数没有执行。而且这里还发现一个新的知识点,那就是回调函数的函数体是可以进行this绑定的。

说到这个创建二维数组,让我不禁又想到了另外一种之前尝试的错误方法。

let item3 = new Array(10).fill( new Array(10) );

是否觉得很完美。然而这种做法会有一个很大的隐患,可以理解为通过fill为一维数组的每一项填充的都是同一个new Araay(10), 所以此时你改变任意一项,其他九项都会跟着一起改变,因为它们都是指向同一个引用。

说了这么多,兄得你学到了么。

猜你喜欢

转载自blog.csdn.net/MessageBox_/article/details/84557641