js的二維陣列
之前輕視了js二維陣列的問題,直到寫筆試題的時候,才發現踩了不該踩的坑,所以今天做一下總結,以防再犯;
起因
起因是這樣的,我想建立一個初值都為1的
4*4
二維陣列,於是乎很直接進行了如下操作:
var d_arr = [];
for(let i = 0;i < 4;i++){
for(let j = 0;j < 4;j++){
d_arr[i][j] = 1;
}
}
console.log(d_arr);複製程式碼
結果卻一直報錯
TypeError: Cannot set property '0' of undefined
經過
思索了一會兒,我又修改為:
var d_arr = [];
var temp_arr = [];
for(let j = 0;j<4;j++){
temp_arr[j] = 0;
}
for(let i = 0;i<4;i++){
d_arr[i] = temp_arr;
}
console.log(d_arr);複製程式碼
不知道大家有沒有看出來,我犯了一個很愚蠢的錯誤。。雖然console.log可以正常列印二維陣列了,但是,每當我修改這個二維陣列的值,比如我想修改[0][1]值為0,當我進行d_arr[0][1]=0;
後,結果是:[ [ 0, 1, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 1, 0, 0 ] ]
可見,如果看成這是一個4*4的矩陣,第二列全被改成了1,其實這是因為,陣列是引用型別的,我賦值的時候,是把同一個陣列賦給了d_arr的每一個元素。。d_arr的每一維都指向的是同一個物件呢。。
結果
雖然上面的修改也可以得到正確結果,但總是看著不正規,上網搜尋,發現真正的操作方法是我一直忽略的new Array()!!
var d_arr = new Array();
for(let i = 0;i<4;i++){
d_arr[i] = new Array();
for(let j = 0;j<4;j++){
d_arr[i][j] = 0;
}
}
console.log(d_arr);複製程式碼
這樣就是一個想要得到的d_arr啦!
ps:new Array還有一個用處,就是指定陣列的長度:var arr = new Array(8);