开发人员每天都会处理数组。作为集合,要查询的重要属性是项目数:Array.prototype.length
。
在JavaScript中,length
它并不总是指示现有元素的数量(对于稀疏数组),并且修改此属性可能会删除元素。
让我们揭开这个属性背后的神秘面纱。
length
数组的值是一个无符号的32位整数,在数值上大于数组中的最高索引。
对于特定的数组类型,此属性的行为有所不同。让我们枚举它们:当数组的元素具有以开头的连续索引时,数组是密集的0
。例如[1, 3, 4]
是致密的,因为索引是连续的:0
,1
和2
。当数组的元素没有以开头的连续索引时,它是稀疏的0
。例如[1, , 4, 6]
是稀疏的,因为元件的索引是不连续的:0
,2
和3
。
长度作为数组中元素的数量
的常见用法length
是确定元素的数量。这对于密集集合类型是正确的:
参见JS Bin中的示例
密集数组没有空,并且项目数对应于highestIndex + 1
。在[3, 5, 7, 8]
最高的索引是3
元素的8
,因此该数组的大小3 + 1 = 4
。
长度大于最大索引的数字
在稀疏数组中,该length
值大于最高索引,但是它并不表示元素的实际数量。查询时length
,它大于元素数。由于阵列中的间隙而发生。
添加或删除元素时,length
仅基于最高索引进行突变。任何不影响最高索引的数组修改都不会修改length
,例如使用时delete
。
参见JS Bin中的示例
长度修改
在前面的说明中,length
只读。但是JavaScript也允许修改此属性。长度修改会影响数组,具体取决于新值和现有的最高索引。它可以删除元素或使数组稀疏。
当新length
数字小于或等于最高索引时,将删除索引大于或等于新大小的所有元素。从数组末尾删除元素的有用方案。
如果使用大于最高索引的数字(或使用大于current的数字length
),则数组将变得稀疏。它很少有用。
请参阅JS Bin中的示例
可以为分配一个不同于数字的类型length
。JavaScript会将原语转换为数字。如果转换结果NaN
小于或小于0
,则引发错误Uncaught RangeError: Invalid array length
。
安全编码
通过创建稀疏数组来修改数组length
,使用删除元素delete
,使用添加元素[newIndex]
是潜在问题的根源。结果是不一致的length
值。JavaScript提供了更安全的选择。
要将元素添加到数组的末尾,请使用Array.prototype.push()并删除最新的pop()。要将元素插入开头,请使用unshift()并删除第一个shift()。对于更复杂的插入,删除或替换,splice()也足够强大。
请参阅JS Bin中的示例
在极少数情况下,数组可以是稀疏的。依靠length
确定元素的数量是不安全的。只需使用一个辅助函数来处理缺少的元素:
in
运算符确定对象是否具有属性。它可以完美地检查元素是否存在于特定索引处。
结论
如本文所见,length
是具有复杂行为的属性。
通常,它的工作不会令人惊讶,但是在处理稀疏数组和修改时最好采取预防措施length
。
另一种选择是完全避免修改此属性并使用该splice()
方法。
另请参见
Array.prototype.length
稀疏数组与密集数组
原著作者:德米特里·帕夫鲁汀
文章来源:国外
文章链接:
Dmitri Pavlutin Blogdmitripavlutin.comPS:原著文章内容为英文版本,建议使用360极速浏览器进行翻译阅读。