数组的空元素empty和undefined有什么区别

我们在使用Array构造函数创建数组时,如果只传入一个数值n,就会返回一个具有empty × n标识的数组,这个n等于"length"属性值,表示数组的长度(即数组中元素的数量),每个empty表示一个空位。

在使用字面量创建数组时,两个,之间如果没有值,也会被当成一个空位。

这个empty是什么类型呢?基本类型中可没有它呀!

先别急,下面我们用Array.from()浅拷贝一个它的副本:

我们从arr数组转换出了一个新数组newArr,这样一来,看起来就比较熟悉了。

原来empty × n可以转换成n个值为undefined的索引属性。

那他们俩是一回事吗?

换句话说:例子中的arrnewArr在实际执行中的表现完全一样吗?

~有时候是,有时候却不是~

比如在用for of循环遍历数组的时候,两者的表现完全相同:

但是在测试有没有数组长度对应的索引元素时,arr返回falsenewArr返回true

到这里我们应该想到了,原来arrnewArr的区别是:arr只有长度,没有对应的索引属性,而newArr不但有长度,而且有对应的索引属性。

两者的for of循环结果之所以相同,是因为两者都是依据数组长度查询对应索引属性的值,其中arr是因为找不到索引属性01234而返回5undefined,而newArr是因为找到了索引属性01234,但它们的值都是undefined而返回5undefined,两者结果虽然相同,但执行过程却不相同。

因此,当我们使用一些只会访问数组中存在的索引属性(而不是根据数组长度按顺序访问长度对应的所有索引属性)的方法时,这些方法会完全忽略数组中的空位。

例如在对两个数组使用forEach()方法时,差别就出来了。