argumentoutofrangeexception:长度不能小于0_数组长度属性背后的魔力有哪些?
开发人员每天都会处理数组。作为集合,要查询的重要属性是项目数: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.com
PS:原著文章内容为英文版本,建议使用360极速浏览器进行翻译阅读。
argumentoutofrangeexception:长度不能小于0_数组长度属性背后的魔力有哪些?相关推荐
- java 数组对象长度_Java中的数组长度:关于Java中数组长度的所有信息
Java中的数组可以包含多个元素,这取决于对象是如何创建的.为了让用户执行不同的操作,必须知道数组的长度.这篇关于"Java中的数组长度"的文章旨在让我们熟悉用于获取数组长度的操 ...
- js 中遍历php数组长度,js怎么判断数组长度
在JavaScript中,可以使用length属性来判断并返回数组长度,语法格式"arrayObject.length":length属性可以返回数组的最大长度,即其值等于数组最大 ...
- html 素组长度,javascript如何定义数组长度?
数组就是一组数据的集合,其表现形式就是内存中的一段连续的内存地址,数组名称其实就是连续内存地址的首地址. 定义数组: 数组对象用来在单独的变量名中存储一系列的值. 我们使用关键词 new 来创建数组对 ...
- php 获取array的长度_php中获取数组长度的方法
php中获取数组长度的方法 php获取数组长度的方法,php为我们提供了两个函数可以计算一维数组长度,如count,sizeof都可以直接统计数组长度,还有获取二维数组的方法,在php中获取数组长度方 ...
- php的数组长度,php中获得数组长度的方法
php中获得数组长度的方法 count统计数组里元素的个数: strlen是统计数组中元素的长度: 你如果想统计数组中所有元素的长度,那就用循环统计吧tqeb 代码: $a = array('0' ...
- java 设置数组长度_java如何增加数组长度
遇到一个面试题:在不使用list的add方法的情况下,动态的添加元素(大概是这个样子): ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,需学习arraylist的相关知识(ht ...
- php查询数组长度,php如何查询数组长度
php查询数组长度的方法:1.使用php函数"count()"来获取数组长度,其语法如"count($arr);":2.通过"sizeof()&quo ...
- android获取js数组长度,javascript如何获取数组长度?
JavaScript中可以通过length方法来获取字符串的长度.数组的 length 属性总是比数组中定义的最后一个元素的下标大 1. 定义和用法 length 属性可设置或返回数组中元素的数目. ...
- java 数组的长度_JAVA怎样获取数组长度?
展开全部 public class Test { public static void main(Sring[] args) { int[] ary = {1,3,5,7,8} ; //数组中装了5个 ...
最新文章
- [铁道部信息化管理]号外
- JavaScript入门(一)
- Tomcat结合Apache、Nginx实现高性能的web服务器
- Access-数据类型与.net OleDbType枚举类型对应关系
- .NET轻量级配置中心AgileConfig
- 时间序列的预处理之纯随机性检验
- centos7下安装python3 解决openssl等一系列问题
- 535 5.7.8 Error: authentication failed: generic failure安装EMOS时SMTP测试报错
- ASP.NET MVC3书店--第二节 控制器(转)
- 去蓝港在线面试Unity3D的笔试题。难吗?知道答案的在评论里写出来分享
- Mac 下svn客户端安装
- 徽章收夺·应用 ( 玩家:3-3 塞迪 )
- RHEL 7 防火墙
- js获取唯一设备码_前端JS获取设备IP地址和唯一标识
- 关于使用stm8单片机的“外部计数”TIMx_ETR测脉冲的软件配置问题!
- Apereo CAS 5.0.X 配置数据库认证方式
- [Note] 多项式全家桶 小球与盒子 分拆数
- 招投标知识分享:影响投标报价编制的8大重要因素
- 关于sbb eax, eax以及sbb eax, 0FFFFFFFFh指令连用
- 22处令人叹为观止的景观