版权声明:本文为博主原创文章,评论区告知一声,大家随意转载! 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), 所以此时你改变任意一项,其他九项都会跟着一起改变,因为它们都是指向同一个引用。
说了这么多,兄得你学到了么。