javascript loop on array of undefined
javascript的数组遍历问题。
当使用Array构造函数新建数组时,1
let array1 = new Array(10)
得到的数组在调用forEach方法是无效的,写过javascript的人基本都试过。
但是换种方式比如
1 | let array2 = new Array(10).fill(undefined) |
构建的数组感觉和直接使用构造函数没什么区别,使用for循环遍历的话都是undefined,length也一样都是10,却可以正常使用forEach方法。
不过假如在chrome的控制台打印一下的话,发现结果还是有很大区别。array1只能看到一个length属性,而array2还能看到索引1-9所有的值。
screenshot

事实上使用Array 构造函数和1
2let array1 = [];
array.length = 10
写法是等效的,只是初始化了数组的length属性,并没有初始化数组的数字索引。可以用 1 in array1实验一下,会返回false。而1 in array2为true。用Object.keys查看更为直观。所以在使用forEach 遍历时,在array1上找不到任何索引,这样forEach的行为就很好理解了。
有点类似一个“not defined”的变量,和显式赋值为undefiled的变量,使用typeof的话都会返回undefined,但是是有很大区别的。
BTW,直接访问未声明变量的值在javascript中会抛出错误,但是作为对象属性访问的话就只会返回undefined不会抛错,比如window.fff或者global.fff这样的,而直接去访问未定义fff的值就会抛出错误了。所以就算array1上不存在索引,使用for循环遍历时还是能得到undefined而不报错。