开发人员每天都会处理数组。作为集合,要查询的重要属性是项目数: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极速浏览器进行翻译阅读。

数组元素的修改会影响到转换过来的结合_数组长度属性背后有什么魔力?相关推荐

  1. java数组及Arrays创建一个int 类型数组 数组元素由键盘录入,每次打印插入排序的结果(数组扩容,数组排序,键盘录入)

    @author silence丶你的名字 java数组及Arrays创建一个int 类型数组 数组元素由键盘录入,每次打印插入排序的结果 初始数组元素1 for死循环 获取用户录入的数据,如果为952 ...

  2. 在c 语言中 引用数组元素时,【单选题】在 C 语言中,引用数组元素时,其数组下标的数据类型不允许是 A. 整型常量 B. 整型表达式 C. 整形符号常量 D. 整型变量...

    [单选题]在 C 语言中,引用数组元素时,其数组下标的数据类型不允许是 A. 整型常量 B. 整型表达式 C. 整形符号常量 D. 整型变量 更多相关问题 [单选] 焖饭和蒸饭哪个更节省燃气?() [ ...

  3. java数组元素的输入_java基础--键盘输入一个数,输出数组中指定元素

    java基础--键盘输入一个数,输出数组中指定元素 java基础--键盘输入一个数,输出数组中指定元素 package com.lcn.day05; import java.util.Scanner; ...

  4. Java基础重温_06:Debug模式(打断点、下一步),基础练习案例(减肥计划if,switch版本、逢七跳过、不死神兔、百钱白鸡、数组元素(求和,索引位置,反转)、判断数组是否相同、评委打分)

    1.IDEA,Debug模式 是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序. 基础练习案例 1.减肥计划if版本 案例需求 ​ 输入星期数,显示今天 ...

  5. 细说PHP笔记03(第7章)--数组与数据结构,数组定义,数组遍历,数组内部指针遍历,键值操作函数,统计数组函数,回调函数处理数组元素,数组排序,拆分、合并、分解、结合数组,数组实现堆栈,随机选取元素

    1.数组 索引数组:索引值是整数 关联数组:索引值是字符串 2.数组的定义 1.以直接赋值的方式声明 $数组名[下标]=资料内容 或 $数组名[关联字符串(键值)]=资料内容 <?php $va ...

  6. argumentoutofrangeexception:长度不能小于0_数组长度属性背后的魔力有哪些?

    开发人员每天都会处理数组.作为集合,要查询的重要属性是项目数:Array.prototype.length. 在JavaScript中,length它并不总是指示现有元素的数量(对于稀疏数组),并且修 ...

  7. Scala数组元素的修改update

    val 修饰一个引用类型,指的是该引用所指向的内存地址值不可变,但是该引用里的元素(属性)是可以改变的.

  8. 数组元素替换_LeetCode基础算法题第183篇:一维数组的重新洗牌

    技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完.目前我选择C语言,Python和Java作为实现语言,因为这三种语 ...

  9. linux shell 数组元素带空格,在bash中解析带有空格的JSON数组

    我试图解析下面的json数组并从中获取值.但它不能将空间作为值.我确实在 stackoverflow 但似乎没用. JSON格式 { "apps": [ { "name& ...

最新文章

  1. 与SENet互补提升,华为诺亚提出自注意力新机制:Weight Excitation|ECCV2020
  2. Android 基本面试题
  3. u32和字符串的转换函数
  4. linux java socket编程_linux下java程序与C语言程序通过SOCKET通信的简单例子
  5. Leetcode 130. 被围绕的区域 (每日一题 20210720 同类型题)
  6. 将Ojective-C代码移植转换为Swift代码
  7. windows编程(八)
  8. Dubbo自定义异常message过长解决
  9. Vue的过滤器,生命周期的钩子函数和使用Vue-router
  10. [心跳] 互联网推送服务原理:长连接+心跳机制
  11. LeetCode 424. 替换后的最长重复字符(双指针+滑动窗口)
  12. html开发列表搜索,前端实例练习 - 可搜索列表
  13. 转: Nginx proxy讲解精华文章集
  14. 微信菜单实现QQ在线聊天(一)
  15. ThingJS学习笔记
  16. Ruby语言的优点和缺点
  17. linux通过文件修改密码,如何通过Linux系统来修改密码
  18. Python:快速去除PDF水印
  19. 紧急提醒!黑客正利用假 ChatGPT 来推送恶意软件
  20. 专精特新中小企业的政策依据

热门文章

  1. leetcode 816. Ambiguous Coordinates | 816. 模糊坐标(Java)
  2. leetcode 714. Best Time to Buy and Sell Stock with Transaction Fee | 714. 买卖股票的佳最时机含手续费(递归->傻缓存->dp)
  3. leetcode 278. 第一个错误的版本(Java版)
  4. 【Flask】Nginx+Gunicorn+Supervisor部署一个Flask项目:步骤总结
  5. Echarts给坐标轴添加自定义属性
  6. 密码学系列之:twofish对称密钥分组算法
  7. 分布式块存储QoS限速算法介绍与实践以及对上层应用的影响
  8. php页面修改器,读取器/修改器
  9. free和top显示可用内存不一致
  10. hdu 4497 GCD and LCM