数组中的empty剖析

news2024/11/16 19:40:04

数组中的empty剖析

一、首先empty是怎么来的

直接通过new Array来新建,手动修改数组的length,逗号之间没有任何数据等

const array = new Array(3);
console.log(array); //*  (3) [empty × 3]

const array2 = [1, , 3];
console.log(array2); //*  [1, empty, 3]

二、如何理解empty

但是按理说,未申明一个变量的值为undefined,这里不应该打印出[1, undefined, 3]么,这里为什么会打印出empty,而不是undefined呢?

const array2 = [1, , 3];
console.log(array2); //*  [1, empty, 3]
console.log(array2[1]); //* undefined

又为什么我们打印数组中该empty位置的时候,却又输出undefined呢?

其实,js中万物皆对象,数组底层也是对象,函数底层也是对象;

那什么是对象呢?

对象就是一系列属性名值对,即某个属性名对应某个属性值;当我们遍历对象时,不在对象中的属性当然不会被访问到。

而在JS中,数组就是对象,甚至数组的一些遍历方法,在内部执行的时候,都是先将数组转化为对象。

可以使用console.dir() 来查看数组对象中的所有属性。

console.dir() 方法可以显示指定 JavaScript 对象的属性列表,并以交互式的形式展现。输出结果呈现为分层列表,包含展开/折叠的三角形图标,可用于查看子对象的内容。

换句话说,console.dir() 是一种在控制台中查看指定 JavaScript 对象的所有属性的方法,开发人员可以通过这种方式轻松获取对象的属性。

—— 引用于MDN之console.dir的使用

可以使用in来判断指定的属性是否在该对象或其原型链中

这个array2是一个长度为3的{0: 1, 2: 3}对象,没有索引为1的数组第二个元素,即数组的空元素empty表示空位;

也就是说,empty表示空位,数组对象没有该位置的索引属性!!!既没有属性,也没有属性值;

但是为什么「console.log(array[2]); //* undefined」呢?

因为可以输出一个对象中”不存在的属性“的值

const obj = {0: 1, 2: 3};
console.log(obj[1]); //* undefined

但是[1, , 3]又和[1, undefined, 3]的区别是什么呢?

在这里插入图片描述

这个array3是一个长度为3的{0: 1, 1: undefined, 2: 3}对象,索引为1的数组第二个元素 值为undefined;

undefined是一种数据类型, 在数组中表示这个位置的值未定义, 但它仍然指向某个内存地址, 这个内存地址指向的是undefined;

三、数组中的empty和undefined的主要区别

使用数组的forEach、map等方法遍历时会自动忽略空位跳过循环, 而使用for循环则会将empty转换为undefined并遍历.

四、如何理解forEach/map对数组中empty的怪异行为

因为在forEach/map底层在遍历的时候,会先判断该对象“坑位对应的索引”的属性是否存在,不存在的话则跳过循环;

const forEach = (arr, callback) => {
	const len = arr.length; //? arr的长度
	for (const i = 0; i < len; i++) {
		if (i in arr) { //* 如果索引存在于数组对象中,调用回调函数
			callback(arr[i], i, arr);
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/496953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软考|软件设计师】进程p1,p2,p3,p4,p5和p6的前趋图

目录 题目&#xff1a; 答&#xff1a; 题目&#xff1a; 进程p1,p2,p3,p4,p5和p6的前趋图如下图所示。用PV操作控制这6个进程之间同步与互斥 的程序如下&#xff0c;程序中的空(1)和空(2)处应分别为________,空(3)和空(4)处分别为________, 空(5)和空(6)处应分别为_______…

数据结构:图的插入和删除

线性表中我们把数据元素叫元素&#xff0c;树中将数据元素叫结点&#xff0c;在图中的数据元素我们称之为顶点&#xff08;Vertex&#xff09;。 线性表中可以没有数据元素&#xff0c;称之为空表。树中可以没有结点&#xff0c;叫做空树。但图没有空图。 线性表中&#xff0c;…

2023年好用的MacBook文件管理软件推荐

我们已经有多年的 macOS 编程经验&#xff0c;也开发了很多大家都可以使用的工具。 我们可以解决各种 Mac 问题。 CleanMyMac X 这里是一些小建议&#xff1a;下载 CleanMyMac 即可快速解决本文章中提到的一些问题。但是&#xff0c;为了帮助您自行操作&#xff0c;我们还整理…

举一反三,从“温度转换“到“python蟒蛇绘制“,快速掌握Python语法

1.温度转换实例 我们先用Pychar写一个小程序,从这个小程序出发,我们将快速学习到python中的基础语法.本章中涉及到的语法只是初始语法部分,后续章节将会详细讲解python语法. "温度转换"实例编写:将两种温度体系转换.摄氏度转换为华氏度华氏度转换为摄氏度. 设计算法…

前端项目的通用优化策略

一、虚拟滚动 当我们开发的时候&#xff0c;遇到大数据加载&#xff0c;页面卡顿的问题应该如何处理&#xff1f;大多数情况下&#xff0c;我们都是尽量通过分页的方式处理这类问题&#xff0c;但是总有一些特殊的情况我们必须把数据全部加载到前端进行处理。我曾经遇到过一个…

智能优化算法:基于厨师的优化算法-附代码

智能优化算法&#xff1a;基于厨师的优化算法 文章目录 智能优化算法&#xff1a;基于厨师的优化算法1.基于厨师的优化算法1.1 初始化1.2 阶段1&#xff1a;厨师导师小组更新&#xff08; X S 1 XS_1 XS1​到 X S N c XS_{Nc} XSNc​更新&#xff09;1.3 阶段2&#xff1a;厨师…

Arduino处理json较大数据流以及GZIP数据流方法

Arduino处理json较大数据流以及GZIP数据流方法 ✨在一些需要使用网络并从网络数据平台获取数据的项目中,大多数据平台,提供支持的数据流格式,一般以json数据格式返回为主。 📓Arduino json数据流格式化处理方法 🏳‍🌈一般处理json数据基于都是通过ArduinoJson库来处理…

运营-9.内容消费

一个优秀的产品&#xff0c;页面层级要尽量浅 所以&#xff0c;对于常见的内容产品&#xff0c;用户做内容消费一般只涉及两层页面&#xff1a; 内容消费-图文 内容消费-视频 内容消费——免费消费模式 对于绝大部分内容产品来说&#xff0c;它们的内 容都提供免费消费模式。…

文本的清洗和标准化:如何处理混乱的数据?

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Dubbo源码篇02---从泛化调用探究Wrapper机制的原理

Dubbo源码篇02---从泛化调用探究Wrapper机制的原理 什么是泛化调用从传统三层架构说起反射调用尝试优化 泛化调用泛化调用怎么用通过Spring使用泛化调用 利用泛化调用改造现有服务 泛化调用小结 Wrapper机制自定义代理dubbo底层wrapper原理小结 小结 什么是泛化调用 从传统三层…

java实现大气污染排放传输路径模拟(iClientOpenlayer前端渲染)

开头先看下模拟实现效果图 一、技术应用及背景说明 了解大气污染传输路径模拟可以帮助我们更好地了解空气污染的来源和传播方式&#xff0c;从而采取更有效的控制措施。这种模拟技术可以根据大气环境和气象条件&#xff0c;模拟出污染物在大气中的传播路径和影响范围&#xff0…

树的储存结构和表示法_20230506

树的储存结构和表示法 前言 树是一类非常重要的数据结构&#xff0c;它是图和其它更高阶数据的基础&#xff0c;人们对树的储存结构和表示法进行了大量研究&#xff0c;这里介绍三种常见的链表结构来表示树的基本方法。 树的双亲表示法 假设以一组连续空间储存数据的结点&a…

MySQL基础(六)多表查询

多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 前提条件&#xff1a;这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键&#xff0c;…

密码学【java】初探究加密方式之非对称加密

文章目录 非对称加密1 常见算法2 生成公钥和私钥3 私钥加密4 私钥加密 公钥解密5 公钥和私钥的保存和读取5.1 **保存公钥和私钥**5.2 读取公钥和私钥 非对称加密 非对称加密算法又称现代加密算法。非对称加密是计算机通信安全的基石&#xff0c;保证了加密数据不会被破解。与对…

argument type mismatch

后端接收前端传来的数据 id&#xff0c;进行批量删除&#xff0c;报错如下&#xff1a; 错误一 removeByIds(ids) com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: java.lang.IllegalArgumentException: argument type mismatch at com.baomidou.mybati…

华为OD机试 - 各位相加(Java)

一、题目描述 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。 二、思路与算法 各位相加&#xff0c;使用递归&#xff0c;出口是结果的长度等于1。 三、Java算法源码 public static int addDigits(int num) {recursion(num);re…

vs2017如何创建一个asax文件

VS2017无法为网站创建Global.asax文件&#xff0c;导致出现错误WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping。 解决方案如下&#xff1a; 勾选要应用的网站&#xff0c;这里我要应用的是ExSite 点击安装&#xff0c;然后点击确定即可。 此时&am…

单片机+PHY芯片+Powerlink协议实现高效数据采集探究(工业总线485和CAN的升级)

CAN总线和RS-485总线作为常用的工业通信总线&#xff0c;在许多工业领域中得到广泛使用。但随着工业应用的不断扩展和网络化的需求增加&#xff0c;它们面临着一些局限性。例如CAN总线虽然具有较高的通信速率和可靠性&#xff0c;但存在节点数量受限、数据传输距离短等问题。而…

Nginx总结

目录 Nginx介绍 Nginx的作用 反向代理 项目架构 实战&#xff1a;访问nginx服务器反向代理到另一台虚拟机上的tomcat服务器 负载均衡 项目架构 实战&#xff1a;访问nginx服务器&#xff0c;是否反向代理到集群中的任意一台tomcat服务器&#xff0c;停止一台tomcat服务器&…

JAVA16新特性

JAVA16新特性 概述 2021年3月16日正式发布,一共更新了17JEP https://openjdk.java.net/projects/jdk/16/ 一 语法层面 1_JEP 397&#xff1a;密封类&#xff08;第二次预览&#xff09; sealed class 第二次预览 通过密封的类和接口来增强Java编程语言,这是新的预览特性,用…