ES6中数组的扩展

1. 扩展运算符

用三个点(...)表示,它如同rest参数的逆运算,将数组转为用逗号分隔的参数序列。扩展就是将一个集合分成一个个的。

console.log(...[1, 2, 3]); // 1, 2, 3

可以用于函数调用

扩展运算符后还可以放置表达式

...(x > 0 ? ['a'] : [])

如果扩展运算符后是一个空数组,则不产生任何效果

[...[], 1]  // [1]

可以替代数组的apply方法

扩展运算符的应用

合并数组

ES5中使用concat方法

const arr1 = ['a', 'b'];
arr1.concat(['c']); // ['a', 'b', 'c']

ES6的合并数组

[...[1, 2, 3], ...[4, 5]]; // [1, 2, 3, 4, 5]

与解构赋值结合

用来生成数组

// ES5
a = list[0]; rest = list.slice(1);
// ES6
[a, ...rest] = list;

如果用于数组赋值,只能将其放在参数的最后一位,否则会报错。

const [...first, last] = [1, 2, 3, 4, 5]; // 报错

函数的返回值

函数只能返回一个值,如果要返回多个值,可以使用扩展运算符

字符串

将字符串转为真正的数组

[...'hello'] // ['h', 'e', 'l', 'l', 'o']

实现了Iterator接口的对象

任何Iterator接口的对象都可以用扩展运算符转为真正的数组。

Map和Set结构、Generator函数

扩展运算符内部调用的是数据结构的Iterator接口,因此只要具有Iterator接口的对

象,都可以使用扩展运算符。

2. Array.from()

将类似数组的对象、可遍历对象转为真正的数组

只要是部署了Iterator接口的数据结构,Array.from都能转为数组。

Array.from('he');
// ['h', 'e']

类似数组的对象本质就是有length属性

Array.from还可以接受第二个参数,作用类似map方法,用来对每个元素进行处理,将处理的值放入返回的数组中。

Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * X);

另一个应用,将字符串转为数组,返回字符串长度。


Array.from({length: 2}, () => 'jack');
// ['jack', 'jack']
// 通过length可以确定第二个参数的运行次数

3. Array.of()

将一组值转为数组

Array.of(3, 22, 3); // [3, 22, 3]

Array()的不足

Array() // []
Array(3) // [, , , ]
Array(3, 11, 8) // [3, 11, 8]

Array.of总是返回参数值组成的数组,如果没有参数就返回一个空数组。

Array.of方法可以用代码模拟

function ArrayOf() {return [].slice.call(arguments);
}

4. 数组实例的copyWithin()

会在当前数组内部将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组,也就是说,使用这个方法会修改当前的数组。

3个参数

  • target(必选),从该位置开始替换数据
  • start(可选), 从该位置开始读取数据,默认为0,如果是负数,表示倒数。
  • end(可选), 到该位置停止读取,默认数组的长度,如果是负数,表示倒数。
[1, 2, 3, 4, 5].copyWithin(0, 3);
// [4, 5, 3, 4, 5]

表示从下标为3的位置开始复制到数组末尾的数据,在下标为0的位置开始换数据。

对于没有copyWithin方法可以使用以下代码

[].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4);// Int32Array [4, 2, 3, 4, 5]

5. 数组实例的find()和findIndex()

  • find

find方法用于找出第一个符合条件的数组成员,参数是一个回调数,所有成员都会依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合的,返回undefined。

[1, 2, -5, 10].find((value, index, arr) => {return value > 0
})
// -5

上面的代码找出小于0的成员。

回调函数可以接受3个参数,依次是当前的值、当前的index以及原数组。

  • findIndex

findIndex返回第一个符合条件的数组成员的位置,如果都不符合,返回-1。

第一个参数是回调函数,第二个参数可选,绑定this对象。

6. 数组实例的fill()

给定值填充一个数组。

['a', 'b', 'c'].fill(7); // [7, 7, 7]

特别适合空数组的初始化。

还可以接受第二个和第三个参数,用来指定填充的起始位置和结束位置。

['a', 'b', 'c'].fill(7, 1, 2);
// ['a', 7, 'c']

上面的代码表示,fill方法从1号位开始向原数组填充7,到2号位之前结束。

7. 数组实例的entries()、keys()和values()

用来遍历数组,可用于for…of循环遍历。

分别是遍历键值对、键、值

for(let index of ['a', 'b'].keys()) {// code
}

8. 数组实例的includes()

方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串中的includes类似。

2个参数

  • 第一个:要检测的值
  • 第二个:开始搜索的位置,默认0。负数表示倒数,负数大于数组长度时,会重置为0
[1, 2, 3].includes(3, 3); // false

indexOf缺点

  • 不够语气化,其含义是找到参数值第一个出现的位置,所以要比较是否不等于-1, 表达起来不直观。
  • 内部使用严格相等运算符(===),会导致对NaN误判。

NaN和自身都不相等。

代替模拟代码

const contains = (() => {Array.prototype.includes ? (arr, value) => arr.includes(value) : (arr, value) => arr.some(el => el === value);
})

Map结构中的has方法是用来查找键名的

Set结构中的has方法用来查找值的

9. 数组的空位

Array当参数为一个值是,则代表生成length为该值的空数组。

Array(3); // [, , ,]

在ES5中对空位处理很不一致

  • forEach()、filter()、every()和some()都会跳过空位
  • map()会跳过空位,但会保留这个值
  • join()和toString()会将空位视为undefined,而undefined和null会被理解成空字符串。

在ES6中明确规定空位转为undefined

Array.from方法会将数组的空位转为undefined。

扩展运算符也会转为undefined

copyWithin方法会连空位一起复制

fill方法会将空位视为正常的数组位置

for…of 循环也会遍历空位

entries()、keys()、values()、find()和findIndex()会将空位转为undefined

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

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

相关文章

【单片机】13-实时时钟DS1302

1.RTC的简介 1.什么是实时时钟(RTC) (rtc for real time clock) (1)时间点和时间段的概念区分 (2)单片机为什么需要时间点【一定的时间点干什么事情】 (3)RTC如何存在于…

【单片机】11-步进电机和直流电机

1.直流电机 1.什么是电机 电能转换为动能 2.常见电机 (1)交流电机【大功率】:两相【200W左右】,三相【1000W左右】 (2)直流电机【小功率】:永磁【真正的磁铁】,励磁【电磁铁】 &…

免费 AI 代码生成器 Amazon CodeWhisperer 初体验

文章作者:浪里行舟 简介 随着 ChatGPT 的到来,不由让很多程序员感到恐慌。虽然我们阻止不了 AI 时代到来,但是我们可以跟随 AI 的脚步,近期我发现了一个神仙 AI 代码生产工具 CodeWhisperer ,它是一项基于机器学习的服…

【多模态融合】TransFusion学习笔记(1)

工作上主要还是以纯lidar的算法开发,部署以及系统架构设计为主。对于多模态融合(这里主要是只指Lidar和Camer的融合)这方面研究甚少。最近借助和朋友们讨论论文的契机接触了一下这方面的知识,起步是晚了一点,但好歹是开了个头。下面就借助TransFusion论文…

C/C++字符函数和字符串函数详解————内存函数详解与模拟

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2 .memcpy函数 3.memmove函…

RTP/RTCP 协议讲解

文章目录 前言一、RTP 协议1、RTP 协议概述2、RTP 工作机制3、RTP 协议的报文结构4、wireshark 抓取 RTP 报文 二、RTCP 协议1、RTCP 协议概述2、RTCP 工作机制3、RTCP 数据报4、wireshark 抓取 RTCP 报文 三、RTSP 和 RTP 的关系四、易混淆概念1、RTP over UDP 和 RTP over RT…

一键智能视频语音转文本——基于PaddlePaddle语音识别与Python轻松提取视频语音并生成文案

前言 如今进行入自媒体行业的人越来越多,短视频也逐渐成为了主流,但好多时候是想如何把视频里面的语音转成文字,比如,录制会议视频后,做会议纪要;比如,网课教程视频,想要做笔记&…

【软件设计师-中级——刷题记录6(纯干货)】

目录 管道——过滤器软件体系结构风格优点:计算机英语重点词汇:单元测试主要检查模块的以下5个特征:数据库之并发控制中的事务:并发产生的问题解决方案:封锁协议原型化开发方法: 每日一言:持续更新中... 个…

CocosCreator3.8研究笔记(二十五)CocosCreator 动画系统-2d骨骼动画spine

大家都知道,在游戏中 一般用帧动画或者骨骼动画,实现 人物的行走、奔跑、攻击等动作。 帧动画,在上一篇已经做了介绍,感兴趣的朋友可以前往阅读: CocosCreator3.8研究笔记(二十四)CocosCreator …

linux入门---信号的保存和捕捉

目录标题 信号的一些概念信号的保存pending表block表handler表 信号的捕捉内核态和用户态信号的捕捉 信号的一些概念 1.进程会收到各种各样的信号,那么程序对该信号进行实际处理的动作叫做信号的递达。 2.我们之前说过当进程收到信号的时候可能并不会立即处理这个信…

计算机考研 | 2016年 | 计算机组成原理真题

文章目录 【计算机组成原理2016年真题44题-9分】【第一步:信息提取】【第二步:具体解答】 【计算机组成原理2016年真题45题-14分】【第一步:信息提取】【第二步:具体解答】 【计算机组成原理2016年真题44题-9分】 假定CPU主频为5…

51单片机可调幅度频率波形信号发生器( proteus仿真+程序+原理图+报告+讲解视频)

51单片机可调幅度频率信号发生器( proteus仿真程序原理图报告讲解视频) 讲解视频1.主要功能:2.仿真3. 程序代码4. 原理图4. 设计报告5. 设计资料内容清单&&下载链接***[资料下载链接](https://docs.qq.com/doc/DS1daV1BKRXZMeE9u)*** 51单片机可…

软件工程与计算总结(三)示例项目描述

本节介绍一个标准的项目描述,大家可以作为蓝本学习~ 目录 一.背景 二.目标 三.系统用户 四.用户访谈要点 1.收银员 2.客户经理 3.总经理 4.系统管理员 五.项目实践过程 一.背景 A是一家刚刚发展起来的小型连锁商店,其前身是一家独立的小百货门面…

算法-数学-斜率-直线上最多的点数

算法-数学-斜率-直线上最多的点数 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/max-points-on-a-line/ 1.2 题目描述 给你一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 2 暴力搜索斜率…

虚拟机VMware的使用流程以及出现的问题附解决方法

虚拟机VMware的使用流程以及出现的问题附解决方法 下载安装 略。。。 创建虚拟机 虚拟机的设置如下:注意网络适配器为NAT 如果出现ip addr 命令:不显示IP地址的话: 解决方式如下: 首先设置网卡:先查看一下onboot是…

OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

OpenCV读取RGB图像 在OpenCV中,读取的图片默认是HWC格式,即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C,因此最小颗粒度是C。 例如,一张形状为2562563的RGB图像,在OpenCV中读取后的格式…

【Java 进阶篇】JDBC 管理事务详解

在数据库操作中,事务是一个非常重要的概念。事务可以确保一系列的数据库操作要么全部成功执行,要么全部失败回滚,以保持数据库的一致性和完整性。在 Java 中,我们可以使用 JDBC 来管理事务。本文将详细介绍 JDBC 管理事务的方法和…

Leetcode1071. 字符串的最大公因子(三种方法,带详细解析)

Leetcode1071. 字符串的最大公因子 对于字符串 s 和 t,只有在 s t … t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。 给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能…

【面试总结大纲】

面试 1. springSpring AOP的具体实现核心概念分别指的是什么?基于注解的切面实现主要包括以下几个步骤:两个切面,它们之间的顺序是怎么控制的 springmvc的工作流程设计模式原则Spring 框架中用到了哪些设计模式? 2. Java-锁2.1锁的分类可重入…

开发调试管理系统遇到的问题大全错误解决大全收集

问题大全错误解决大全 多模块项目依赖中,项目启动失败-org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException报错:Error: The project seems to require yarn but it‘s not installednpm ERR! fatal: Could not read fro…