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

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

前言

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

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

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

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

溯源

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

在这里插入图片描述

根据流程实现代码:

在这里插入图片描述

Array.prototype.forEach = function (callback) {const len = this.lengthif (typeof callback !== 'function') {throw new TypeError(callback + ' is not a function')}let k = 0while (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),所以不会打印

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux-vim的使用
  • 关于区块链的安全和隐私
  • Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
  • java核心基础
  • Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch
  • 第十四届蓝桥杯嵌入式国赛
  • react开发环境搭建
  • 输入5个数,求中值,verilog实现
  • Splunk、Snort在入侵检测中的应用
  • Lodash库
  • 一.python入门
  • Go 综合题面试题
  • VMware Workstation 17.5安装教程
  • Java日期处理:将字符串yyyyMMdd转换为yyyy年MM月dd日
  • 云栖大会Day1:云应用开发平台 CAP 来了
  • 03Go 类型总结
  • k8s如何管理Pod
  • react 代码优化(一) ——事件处理
  • Redis学习笔记 - pipline(流水线、管道)
  • springMvc学习笔记(2)
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Sublime text 3 3103 注册码
  • 成为一名优秀的Developer的书单
  • 机器学习学习笔记一
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 普通函数和构造函数的区别
  • 首页查询功能的一次实现过程
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信小程序--------语音识别(前端自己也能玩)
  • 我的zsh配置, 2019最新方案
  • 无服务器化是企业 IT 架构的未来吗?
  • 一份游戏开发学习路线
  • hi-nginx-1.3.4编译安装
  • ​渐进式Web应用PWA的未来
  • # centos7下FFmpeg环境部署记录
  • (3)llvm ir转换过程
  • (3)nginx 配置(nginx.conf)
  • (AngularJS)Angular 控制器之间通信初探
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (回溯) LeetCode 46. 全排列
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net wcf memory gates checking failed
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • ::什么意思
  • @Builder用法
  • @软考考生,这份软考高分攻略你须知道
  • [android] 看博客学习hashCode()和equals()
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C/C++随笔] char与unsigned char区别
  • [C++][opencv]基于opencv实现photoshop算法图像剪切
  • [CDOJ 1343] 卿学姐失恋了
  • [Codeforces] probabilities (R1600) Part.1