当前位置: 首页 > article >正文

【JS】forEach中push为何不会陷入死循环,稀疏数组空元素为何不会被遍历

前言

使用 forEach 时,遇到过如下几个问题

  1. 为什么稀疏数组空元素不会被遍历在这里插入图片描述

  2. 为什么每次循环时 push 不会陷入死循环在这里插入图片描述

  3. 为什么使用splice删除元素后,访问不到下一位元素在这里插入图片描述

溯源

查阅 ecma官方文档,使用ECMA-262, 14th edition, June 2023版

在这里插入图片描述

根据流程实现代码:

在这里插入图片描述

Array.prototype.forEach = function (callback) {
  const len = this.length
  if (typeof callback !== 'function') {
    throw new TypeError(callback + ' is not a function')
  }
  let k = 0
  while (k < len) {
    if (k in this) {
      callback(this[k], k, this)
    }
    k++
  }
}

1. 为什么稀疏数组空元素不会被遍历

可以看到稀疏数组的 empty 并不会被记录,但是却可以改变长度

在这里插入图片描述

所以当遍历前两个空元素时,并不会进入判断

在这里插入图片描述

2. 为什么每次循环时 push 不会陷入死循环

length固定
在这里插入图片描述

3. 为什么使用splice删除元素后,访问不到下一位元素

在这里插入图片描述

这里以 [1, 2, 3, 4, 5] 说明
第一次遍历后删除元素1、k为1,此时数组为[2, 3, 4, 5],打印1;
第二次遍历,访问[2, 3, 4, 5]中索引为1的元素,即3,随后删除元素3、k为2,此时数组为[2, 4, 5]
第三次遍历,访问[2, 4, 5]中索引为2的元素,即5,随后删除元素5、k为3,此时数组为[2, 4]
后面由于无法进入判断 if(k in this),所以不会打印


http://www.kler.cn/a/324688.html

相关文章:

  • 创建vue+electron项目流程
  • java项目-jenkins任务的创建和执行
  • Node.js GET/POST请求、WEB模块使用介绍 (基础介绍 八)
  • 【C++】list 与 string 基础与实现字符串操作
  • ADC输出码和输入电压转换关系
  • 【因果分析方法】MATLAB计算Liang-Kleeman信息流
  • 基于微信开发助手企鹅音乐微信小程序的设计与实现(源码+文档+讲解)
  • 上交所服务器崩溃:金融交易背后的技术隐患暴露杭州BGP高防服务器43.228.71.X
  • 双十一有什么好物推荐?绝对不能错过的五款产品
  • NLP技术在营业选址中的实践与探索
  • 【YashanDB知识库】GBK库,生僻字插入nvarchar2字段后乱码问题
  • 高通平台(2)Camera 效果 Fast tuning
  • Qt 项目优化实践方向
  • LeetCode题练习与总结:为运算表达式设计优先级--241
  • Kafka 的重平衡问题详解及解决方案
  • 【Linux】 tcp | 解除服务器对tcp连接的限制 | 物联网项目配置
  • (十七)、Mac 安装k8s
  • Redis桌面工具:Tiny RDM
  • py-mmcif包解析蛋白质结构的装配信息
  • 【NodeJS】npm、yarn、pnpm当前项目设置国内镜像源
  • 别人做谷歌seo凭什么比你好?
  • lua基础语法
  • 【可测试性实践】C++ 单元测试代码覆盖率统计入门
  • 探索 LangChain: 架构、组件和应用
  • 【CSS in Depth 2 精译_039】6.3 CSS 定位技术之:相对定位(上)
  • WPF一个控件根据另一个控件的某种状态的改变从而改变自身某种状态