开发人员每天都会处理数组。作为集合,要查询的重要属性是项目数:Array.prototype.length
在JavaScript中,length它并不总是指示现有元素的数量(对于稀疏数组),并且修改此属性可能会删除元素。
让我们揭开这个属性背后的神秘面纱。

length 数组的值是一个无符号的32位整数,在数值上大于数组中的最高索引。

对于特定的数组类型,此属性的行为有所不同。让我们枚举它们:当数组的元素具有以开头的连续索引时,数组是密集0。例如[1, 3, 4]是致密的,因为索引是连续的:012。当数组的元素没有以开头的连续索引时,它是稀疏0。例如[1, , 4, 6]是稀疏的,因为元件的索引是不连续的:023

长度作为数组中元素的数量

的常见用法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 Blog​dmitripavlutin.com

PS:原著文章内容为英文版本,建议使用360极速浏览器进行翻译阅读。

argumentoutofrangeexception:长度不能小于0_数组长度属性背后的魔力有哪些?相关推荐

  1. java 数组对象长度_Java中的数组长度:关于Java中数组长度的所有信息

    Java中的数组可以包含多个元素,这取决于对象是如何创建的.为了让用户执行不同的操作,必须知道数组的长度.这篇关于"Java中的数组长度"的文章旨在让我们熟悉用于获取数组长度的操 ...

  2. js 中遍历php数组长度,js怎么判断数组长度

    在JavaScript中,可以使用length属性来判断并返回数组长度,语法格式"arrayObject.length":length属性可以返回数组的最大长度,即其值等于数组最大 ...

  3. html 素组长度,javascript如何定义数组长度?

    数组就是一组数据的集合,其表现形式就是内存中的一段连续的内存地址,数组名称其实就是连续内存地址的首地址. 定义数组: 数组对象用来在单独的变量名中存储一系列的值. 我们使用关键词 new 来创建数组对 ...

  4. php 获取array的长度_php中获取数组长度的方法

    php中获取数组长度的方法 php获取数组长度的方法,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度,还有获取二维数组的方法,在php中获取数组长度方 ...

  5. php的数组长度,php中获得数组长度的方法

    php中获得数组长度的方法 count统计数组里元素的个数: strlen是统计数组中元素的长度: 你如果想统计数组中所有元素的长度,那就用循环统计吧tqeb 代码: $a  =  array('0' ...

  6. java 设置数组长度_java如何增加数组长度

    遇到一个面试题:在不使用list的add方法的情况下,动态的添加元素(大概是这个样子): ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,需学习arraylist的相关知识(ht ...

  7. php查询数组长度,php如何查询数组长度

    php查询数组长度的方法:1.使用php函数"count()"来获取数组长度,其语法如"count($arr);":2.通过"sizeof()&quo ...

  8. android获取js数组长度,javascript如何获取数组长度?

    JavaScript中可以通过length方法来获取字符串的长度.数组的 length 属性总是比数组中定义的最后一个元素的下标大 1. 定义和用法 length 属性可设置或返回数组中元素的数目. ...

  9. java 数组的长度_JAVA怎样获取数组长度?

    展开全部 public class Test { public static void main(Sring[] args) { int[] ary = {1,3,5,7,8} ; //数组中装了5个 ...

最新文章

  1. [铁道部信息化管理]号外
  2. JavaScript入门(一)
  3. Tomcat结合Apache、Nginx实现高性能的web服务器
  4. Access-数据类型与.net OleDbType枚举类型对应关系
  5. .NET轻量级配置中心AgileConfig
  6. 时间序列的预处理之纯随机性检验
  7. centos7下安装python3 解决openssl等一系列问题
  8. 535 5.7.8 Error: authentication failed: generic failure安装EMOS时SMTP测试报错
  9. ASP.NET MVC3书店--第二节 控制器(转)
  10. 去蓝港在线面试Unity3D的笔试题。难吗?知道答案的在评论里写出来分享
  11. Mac 下svn客户端安装
  12. 徽章收夺·应用 ( 玩家:3-3 塞迪 )
  13. RHEL 7 防火墙
  14. js获取唯一设备码_前端JS获取设备IP地址和唯一标识
  15. 关于使用stm8单片机的“外部计数”TIMx_ETR测脉冲的软件配置问题!
  16. Apereo CAS 5.0.X 配置数据库认证方式
  17. [Note] 多项式全家桶 小球与盒子 分拆数
  18. 招投标知识分享:影响投标报价编制的8大重要因素
  19. 关于sbb eax, eax以及sbb eax, 0FFFFFFFFh指令连用
  20. 22处令人叹为观止的景观

热门文章

  1. 那些我曾经犯过的低级编程错误
  2. win10查看端口占用
  3. Android dumpsys命令详细使用
  4. 链表的插入、删除、排序的程序
  5. php数据库操作命令精华大全
  6. MySQL中update一条record的过程
  7. 啥叫旁路电容?啥叫去耦?可以不再争论了吗
  8. Linux 内核完成接口
  9. 老王带你理解算法复杂度O(1),O(N),O(N^2)
  10. python barrier_Python线程障碍对象Barrier原理详解