以前輕視了js二維數組的問題,直到寫筆試題的時候,才發現踩了不應踩的坑,因此今天作一下總結,以防再犯;數組
原由是這樣的,我想建立一個初值都爲1的bash
二維數組,因而乎很直接進行了以下操做:ui
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);複製代碼
結果卻一直報錯spa
TypeError: Cannot set property '0' of undefinedcode
思索了一下子,我又修改成:對象
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的每一維都指向的是同一個對象呢。。console
雖然上面的修改也能夠獲得正確結果,但老是看着不正規,上網搜索,發現真正的操做方法是我一直忽略的new Array()!!class
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);
引用