以前轻视了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);
引用