Set、Map、类数组,傻傻区分不清楚?

news2024/11/18 8:31:35

前言

大家都知道,数组和对象是两种不同的数据结构,虽说在js数据类型中都属于Object,但是还是有一定的区别,通过字面量以及isArray、instanceof等方法,我们很好区分这两者。由于使用场景的原因js中衍生了很多类似的数据结构,这些数据结构和数组、对象非常接近,使用过少或基础不牢固的同学(没错,说的是我)对他们的概念、用法不是很清晰,并且很容易混淆。今天在这里对这一类的数据结构做一个总结,让我们能明确区分他们的使用场景和用法。

类数组

在js中,具有length属性,但却不能使用数组类的方法的数据结构被称为类数组。

arguments

arguments是一个可表示传递给函数的参数的类数组对象,所有非箭头函数都可以使用。

function fun(a, b) {
//Arguments(2) [1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ]
 console.log(arguments)
 //1
 console.log(arguments[0])
}
fun(1,2); 

arguments包含一个callee属性,该属性可指向参数所属的当前执行函数;

其他

NodeList:节点的集合,通常是某些方法属性返回的实时集合。如Node.childNodes或document.querySelectorAll方法返回的标签、节点。

HTMLCollection:表示一个包含了元素的通用集合(根据文档流顺序展示);

其他符合类数组概念的数据结构;

剩余参数

在ES6中,可以使用剩余参数语法来表示一个不定量的参数,这个参数为数组,以三个点为前缀。

function(...args) {
} 

和arguments的区别:

  • 剩余参数表示无对应形参的实参,arguments对象表示传给函数的所有实参;
  • arguments是类数组,剩余参数是数组,具有数组的属性和方法;
  • 剩余参数没有arguments自身的属性;

剩余参数语法可以用来展开数组和对象

//展开数组
//123
console.log(...[1,2,3]);

//展开对象,必须放在一个对象内
//{a: 1, b: 2, c: 3}
console.log({...{a:1,b:2,c:3}}); 

通过展开语法可以复制、合并数组;字符串转数组(字符串可看作类数组,通过展开运算符直接展开);类数组转换数组;复制对象、和解构赋值结合使用等等。

Set

Set是一种特殊的对象,是一系列无序、无重复值的数据集合,无字面量写法,通过Set构造函数的实例创建。

const s = new Set(); 

Set的方法和属性

Set.add() 在Set的尾部添加一个元素,可连续调用:

const s = new Set();
s.add(a).add(1).add(2); 

Set.has() 检测是否包含某个值的方法,返回一个布尔值

const s = new Set();
s.has(1); 

Set.delete() 删除指定值

const s = new Set();
s.delete(1); 

Set.clear() 删除所有值,清空set;

const s = new Set();
s.clear(); 

Set.forEach() 按照成员添加时的顺序进行遍历,键和值相等;

const s = new Set();
//它有两个参数第一个是回调,第二个表示this指向;
s.forEach(function(value,key,set){// value与key相等,set为原set;console.log(value,key,set)
},windows) 

Set.entries() 返回一个新的迭代器对象,包含所有Set值的数组,键和值相等;

const s = new Set();
s.add(1).add(2);
const i = s.entries();

for (const entry of i) {console.log(entry);//[1, 1]//[2, 2]
} 

Set.size() 表示set的长度,类似于数组的length;

const s = new Set();
//0
s.size; 

Set的用法及使用场景

添加不同参数的形式创建Set:

//数组
const s = new Set([1,2,3]);
console.log(s);//Set(3) {1, 2, 3}

//字符串
const s = new Set("abc");
console.log(s);//Set(3) {a, b, c}

//类数组
function fun() {const s = new Set(argument);console.log(s);//Set(3) {1, 2, 3}
}
fun(1,2,3)

//Set
const s = new Set("abc");
const s1 = new Set(s);
console.log(s1);//Set(3) {a, b, c} 

使用场景:

  • 字符串或数组去重;
  • 仅遍历,不需要数组下标访问时;
  • 使用Set自身的方法和属性时;

注意:Set中判断成员值重复是通过===,特殊的是在Set中NaN被认为与NaN重复(Map同理);

Map

Map是一种键值对的集合,和普通对象非常接近区别是对象的键一般是字符串,Map的键任何类型的数据都可以;通过Map构造函数实例创建;

let m = new Map();
m.set(key,value); 

Map的方法和属性

Map.set() 在Map中添加一组指定键关联的值:

const m = new Map();
//Map(3) {"a" => 1, "b" => 2, "c" => 3}
m.set("a",1).set("b",2).set("c",3); 

Map.get() 返回Map中指定键的值,没有则返回undefined

//1
m.get("a"); 

Map.delete() 删除指定键的值,返回布尔值

//true
m.delete("a"); 

Map.clear() 删除所有值,清空Map;

m.clear(); 

Map.forEach() 按照成员添加时的顺序进行遍历,执行回调;

const m = new Map();
//它有两个参数第一个是回调,第二个表示this指向;
m.forEach(function(value,key,Map){console.log(value,key,Map)
},windows) 

Map.entries() 返回一个新的迭代器对象,包含所有Map键和值的数组,以插入顺序排列;

const m = new Map();
m.set('a', 1);
m.set('b', 2);
const i = m.entries();
console.log(i.next().value);
// expected output: ["a", 1] 

Map.size() 表示Map的长度,类似于数组的length;

const m = new Set();
//0
m.size; 

Map的用法及使用场景

添加不同参数的形式创建Map:

//数组,必须是二维数组,键和值对应
const m = new Map([["a",1],["b",2]]);
console.log(m);//Map(2) {"a" => 1, "b" => 2}

//Set,必须键和值都有
const s = new Set([["a",1],["b",2]]);
const m = new Map(s);
console.log(m);//Map(2) {"a" => 1, "b" => 2}

//Map
const m = new Map([["a",1],["b",2]]);
const m1 = new Map(m);
console.log(m);//Map(2) {"a" => 1, "b" => 2} 

使用场景:

  • 字符串以外的值做key;
  • 复制Map;
  • 只需要键值对时可使用Map;
  • 使用Map自身的方法和属性时;
  • 当模拟现实世界实体时,如人、物等使用对象,字面量表示比较合适;

写在最后

js因其弱类型语言的特点,数据类型之间转换非常容易、灵活,它的标准内置对象及所携带的方法和属性非常丰富,熟练的掌握它们才能根据业务场景灵活的应用。

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

基于java(springboot+mybatis)网上音乐商城设计和实现以及论文报告

基于java(springbootmybatis)网上音乐商城设计和实现以及论文报告 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言…

Spring Boot 热部署

Spring Boot 热部署一、添加热部署框架支持二、Settings 开启项目自动编译三、开启运行中热部署四、使用 Debug 启动 (非 Run)一、添加热部署框架支持 或者右击鼠标添加依赖: 或者使用插件: 二、Settings 开启项目自动编译 三、开启运行中热部署 老版…

【数据库概论】第一章 绪论

第一章 绪论 1.1 数据库系统概述 数据库的四个基本概念 1.数据 数据是数据库中存储的基本对象,一般数据是描述事物的符号记录,这种符号记录可以输数字,也可以是文字、徒刑、音频等。 2.数据库 数据库是长期存储在计算机内有组织的&…

Leetcode动态规划题解

第一题 509. 斐波那契数 题目描述:斐波那契数(通常用 F(n) 表示)形成的序列称为斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) …

【计算机网络】计算机网络基础

计算机是人类社会不可或缺的工具,而单独的一台计算机的功能也是有限的,计算机需要和其它的设备相互连接通信形成的计算机网络才能对人类发展带来巨大的影响。 目录 计算机网络 通信协议 网络结构 网络边缘 接入网 网络核心 时延和吞吐量 时延 吞…

.Net Core6.0项目发布在IIS上访问404的问题

ASP.Net Core6.0项目发布在IIS上访问404的问题 进入线程池画面,将当前程序的线程池设为“无托管代码” 修改配置文件 Web.config,以下缺一不可 需要引用架包:Swashbuckle.AspNetCore.SwaggerUI.NetCore 6.0 自带集成了Swagger , 在发布项目时…

C++模板(函数模板、类模板)

目录 一、泛型编程 二、函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 模板参数的匹配原则 三、类模板 类模板的定义格式 类模板的实例化 四、扩展 函数模板一定是推演?类模板一定是指定? 模板的分离编译 一…

MySQL高级【行级锁】

1:行级锁1.1:介绍行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在 InnoDB存储引擎中。 InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的&a…

WPF中Binding数据校验、并捕获异常信息的三种方式

Binding数据校验、并捕获异常信息的三种方式 WPF在使用Binding时,经常需要进行数据校验,如果校验失败需要捕获失败的原因,并加以展示,本文主要介绍数据校验异常并捕获的三种方式。 依赖属性异常捕获 先定义一个依赖属性 publi…

【Nacos】Nacos配置中心的使用与SpringCloud整合

在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余。配置中心将配置从各应…

哪儿有微服务开源项目?

随着数字化时代的到来,微服务开源项目的应用价值逐渐凸显。作为提升企业办公协作效率的低代码开发平台项目,其表现出来的灵活性、易操作、简便的特性,成为现代化办公管理中的重要合作伙伴。我们今天一起来了解什么是微服务开源项目。 一、微服…

基于JavaWeb实现蜀南调味品商城物流配货系统

一、项目介绍 本文系统利用JavaWeb技术,设计和实现了连接公司、客户公司、物流运输为桥梁的销售配送管理系统,并以网络技术和信息技术在销售配送中的应用为重点,实现员工登录模块、员工信息管理模块、库存管理模块、订单处理模块、包装管理模…

高通Wi-Fi 7网络芯片方案IPQ9574,IPQ9554,IPQ9514,IPQ9570,IPQ9550,IPQ9510

networking pro 1620:芯片型号IPQ9574,支持4频段16路数据流,峰值速率33Gbps,支持4个2.5G口,1个5G口,1个万兆口;networking pro 1220:芯片型号IPQ9574,支持3频段12路数据流…

三个案例详解不同网段之间如何互通

当然还可以通过三层交换机划分VLAN配置更好。这里主要讲通过普通路由器之间互通一台路由器连接另外一台路由器,这两台路由器分别连接不同的网段,那么如果要这两个网段互通,则必须配置路由,这个就是静态路由。案例一、不同网段之间…

【练习】Day06

努力经营当下,直至未来明朗! 文章目录一、选择二、编程最小时间差答案1. 选择2. 编程普通小孩也要热爱生活! 一、选择 散列技术中的冲突是指( ) A. 两个元素具有相同的序号 B. 两个元素的键值不同,而其他…

Linux权限理解

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C ☂️<3>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;linux当中对于权限的理解。 &#x1f490;一.生活中的权限 &#x1f338;二.Linux权限…

一文让你弄懂多租户数据库设计⽅案

文章目录前言一、设计方案二、方案剖析三、方案总结四、方案选型五、引申问题的解决方案六、写在最后前言 多租户是SaaS&#xff08;Software-as-a-Service&#xff09;下的一个概念&#xff0c;意思为软件即服务&#xff0c;即通过网络提供软件服务。 SaaS平台供应商将应用软…

微软的AD登录loginRedirect

我这边技术栈是reactts 如果你是vue&#xff0c;直接将tsx文件改成jsx就可以或者不该也没问题 上篇文章介绍了msal 的弹框登录&#xff0c;先介绍下重定向登录这个相对弹框登录要烦很多。。。中国内网看我查询的资料很少&#xff0c;只有微软系的公司才会有相对应的需求。此处自…

代码随想录算法训练营第二天|977.有序数组的平方 |209.长度最小的子数组 |59.螺旋矩阵II

977 有序数组平方 看完题后的思路 双指针 思路 本题如果使用暴力解法,需要按照绝对值将数组排序0(logn),然后进行平方.(或先平方,再排序,这样可以直接调用排序函数) 可以使用双指针法,定义两个指针,左指针是当前绝对值最小的负数,右指针是当前绝对值最小的整数,每一轮将较小…

03、openscenegraph(简称osg)源代码编译

通过上一节&#xff0c;我们准备下载好了osg源代码和依赖库&#xff0c;并安装了CMake、VS2013开发环境&#xff0c;接下来就可以进入编译工作了。 首先&#xff0c;将下载的openscenegraph源代码和依赖库3rdParty_VS2012.3_v110_x86_x64_V8b_full解压到同一个目录下&#xff…