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

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

这个empty
是什么类型呢?基本类型中可没有它呀!
先别急,下面我们用Array.from()
浅拷贝一个它的副本:

我们从arr
数组转换出了一个新数组newArr
,这样一来,看起来就比较熟悉了。
原来empty × n
可以转换成n
个值为undefined
的索引属性。
那他们俩是一回事吗?
换句话说:例子中的arr
和newArr
在实际执行中的表现完全一样吗?
有时候是,有时候却不是~
比如在用for of
循环遍历数组的时候,两者的表现完全相同:

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

到这里我们应该想到了,原来arr
和newArr
的区别是:arr
只有长度,没有对应的索引属性,而newArr
不但有长度,而且有对应的索引属性。
两者的for of
循环结果之所以相同,是因为两者都是依据数组长度查询对应索引属性的值,其中arr
是因为找不到索引属性0
、1
、2
、3
、4
而返回5
个undefined
,而newArr
是因为找到了索引属性0
、1
、2
、3
、4
,但它们的值都是undefined
而返回5
个undefined
,两者结果虽然相同,但执行过程却不相同。
因此,当我们使用一些只会访问数组中存在的索引属性(而不是根据数组长度按顺序访问长度对应的所有索引属性)的方法时,这些方法会完全忽略数组中的空位。
例如在对两个数组使用forEach()
方法时,差别就出来了。
