JS:数组索引的有效范围

by @zhangbao(zhangbao) #0106html

概览

  • 数组索引的有效范围是介于 +0 ≤ i < 2 - 1 之间的天然数。
  • 设置的无效索引,不会触发 length 属性的改变。

image.png

正文

规范中的定义

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 之间的整数索引,即 04294967294 之间的整数,超出这个范围以外的都属于无效值。code

索引测试

** cdn

无效值测试

咱们先用 4294967295,这个超出范围外的值试一下:htm

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

有效值测试

加下来我们拿最大的有效值 4294967294 作测试:blog

瞧,经赋值后,发现数组的 .length 值变为 4294967295 了。length 属性对这个索引处值的设置是有反应的。索引

额外说明

上面在测试索引值时,虽然看见无效值索引值 4294967295 在打印 array 时,依旧能看到。但它其实只是做为普通对象属性存在。若是用 for...of 循环遍历,发现并不会看见它。由于遍历是基于 length 属性的。length 属性为 0,天然认为数组里是空的。ip

image.png

但设置的若是是有效索引值,状况就不一样了。

image.png

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

(完)

相关文章
相关标签/搜索