by @zhangbao(zhangbao) #0106
概览
- 数组索引的有效范围是介于 +0 ≤ i < 2 - 1 之间的自然数。
- 设置的无效索引,不会触发
length属性的改变。

正文
规范中的定义
ECMAScript® 2019 6.1.7 The Object Type 一节引入了数组索引范围的概念。
An integer index is a String-valued property key that is a canonical numeric String (see 7.1.16) and whose numeric value is either +0 or a positive integer ≤ 2 - 1. An array index is an integer index whose numeric value i is in the range +0 ≤ i < 2 - 1.
首先,规范中定义了整数索引(integer index)的概念:即字符串属性名(property key)经转换后,其值是介于 +0 ≤ i < 2 - 1 之间的整数;而数组索引则是范围介于 +0 ≤ i < 2 - 1 之间的整数索引,即 0 到 4294967294 之间的整数,超出这个范围之外的都属于无效值。
索引测试
无效值测试
我们先用 4294967295,这个超出范围外的值试一下:

发现数组的 .length 属性对此无动于衷,依旧是 0。按道理来说,应该是 4294967296 才是,说明我们设置索引是无效的,这个索引值被作为普通对象属性设置了,没有跟 length 属性发生关系。
有效值测试
加下来咱们拿最大的有效值 4294967294 做测试:

瞧,经赋值后,发现数组的 .length 值变为 4294967295 了。length 属性对这个索引处值的设置是有反应的。
额外说明
上面在测试索引值时,虽然看见无效值索引值 4294967295 在打印 array 时,依旧能看到。但它其实只是作为普通对象属性存在。如果用 for...of 循环遍历,发现并不会看见它。因为遍历是基于 length 属性的。length 属性为 0,自然认为数组里是空的。

但设置的如果是有效索引值,情况就不同了。

我们设置了 arr[5] 的值后,数组的有效成员是 6 个:包含 5 个空位(empty value)和一个值 "xxx"。图中框出的就是遍历数组 arr 后的结果。
(完)