1. 程式人生 > >js建立二維陣列小坑

js建立二維陣列小坑

今天在建立一個二維陣列時,遇到一個小坑,最後發現是對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), 所以此時你改變任意一項,其他九項都會跟著一起改變,因為它們都是指向同一個引用。

說了這麼多,兄得你學到了麼。