ES6学习笔记7 数组的扩展

JS——ES6、ES7、ES8、ES9、ES10介绍 ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言。目前JavaScript使用的ECMAScript版本为ECMA-417。关于ECMA的最新资讯可以浏览ECMA news查看。ECMA规范最终由TC39敲定。TC39由包括浏览器厂商在内的各方组成,他们开会推动JavaScript提案沿着一条严格的发展道路前进。Stage 0: strawman——最初想法的提交。 阅读详情

扩展运算符

扩展运算符(spread)是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。

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

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

[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]

其可用于函数调用,作为参数序列

function push(array, ...items) {
  array.push(...items);
}

扩展运算符后面还可以放置表达式,如果后面是一个空数组,则不产生任何效果

const arr = [
  ...(x > 0 ? ['a'] : []),
  'b',
];

由于扩展运算符可以展开数组,因此不需要使用apply方法将数组转换为函数参数了

// ES5 的写法
Math.max.apply(null, [14, 3, 77])

// ES6 的写法
Math.max(...[14, 3, 77])

// 等同于
Math.max(14, 3, 77);

可以用来合并数组,不过,这两种方法都是浅拷贝,当数组内有引用型成员,如果修改了原数组成员的引用,会同步反映到新数组

const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];

// ES5 的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]

// ES6 的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]

可以与解构赋值结合,生成新的数组,但扩展运算符只能放在参数的最后一位,否则会报错

const [first, ...rest] = [1, 2, 3, 4, 5];
first // 1
rest  // [2, 3, 4, 5]

const [first, ...rest] = [];
first // undefined
rest  // []

const [first, ...rest] = ["foo"];
first  // "foo"
rest   // []

扩展运算符还可以将字符串转换为数组,其能正确识别4个四节的Unicode字符

[...'hello']
// [ "h", "e", "l", "l", "o" ]
'x\uD83D\uDE80y'.length // 4
[...'x\uD83D\uDE80y'].length // 3

任何具有Iterator接口的对象都可以使用扩展运算符将其转为真正的数组,包括NodeList对象、Map和Set结构、Generator函数等

let nodeList = document.querySelectorAll('div');
let array = [...nodeList];
let map = new Map([
  [1, 'one'],
  [2, 'two'],
  [3, 'three'],
]);

let arr = [...map.keys()]; // [1, 2, 3]
const go = function*(){
  yield 1;
  yield 2;
  yield 3;
};

[...go()] // [1, 2, 3]

Array.from()

Array.from方法将类似数组的对象和可遍历的对象转换为真正的数组(包括NodeList集合、arguments对象等),其实,任何具有length属性的对象都可以转换为数组。

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};

// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']

// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

下面代码返回了一个具有三个成员的数组,而扩展运算符转换不了这个对象

Array.from({ length: 3 });
// [ undefined, undefined, undefined ]

Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。如果map函数里面用到了this关键字,还可以传入Array.from的第三个参数,用来绑定this。

Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9]

Array.of()

Array.of方法用于将一组值,转换为数组。没有参数,就返回一个空数组

Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1

copyWithin()

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

Array.prototype.copyWithin(target, start = 0, end = this.length)

//target(必需):从该位置开始替换数据。如果为负值,表示倒数
//start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示倒数
//end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。
// 将3号位复制到0号位
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]

// -2相当于3号位,-1相当于4号位
[1, 2, 3, 4, 5].copyWithin(0, -2, -1)
// [4, 2, 3, 4, 5]

// 将3号位复制到0号位
[].copyWithin.call({length: 5, 3: 1}, 0, 3)
// {0: 1, 3: 1, length: 5}
//此处相当于{0:undefined, 1:undefined, 2:undefined, 3:1, 4:undefined, length:5}.copyWithin(0,3);
//结果为{0:1, 1:undefined, 2:undefined, 3:1, 4:undefined, length:5}
//相当于{0:1, 3:1, length:5}

// 将2号位到数组结束,复制到0号位
let i32a = new Int32Array([1, 2, 3, 4, 5]);
i32a.copyWithin(0, 2);
// Int32Array [3, 4, 5, 4, 5]

find()和findIndex()

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

[1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;
}) // 10

其回调函数包括3个参数,当前项的值、索引以及整个数组

数组实例的findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1

[1, 5, 10, 15].findIndex(function(value, index, arr) {
  return value > 9;
}) // 2

这两个方法都可以接受第二个参数,用来绑定回调函数的this对象。它们都可以发现NaN,弥补了indexOf方法的不足


fill()

fill方法使用给定值,填充一个数组。数组原有的元素会被覆盖

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

new Array(3).fill(7)
// [7, 7, 7]

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

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

该方法填充的方式为浅拷贝,若填充的类型是对象,则只是同一个内存地址的对象。


entires()、keys() 和 values()

ES6 提供三个新的方法——entries(),keys()和values()——用于遍历数组。它们都返回一个遍历器对象。其中entries()是对键值对的遍历,keys()是对键的遍历,values()是对值的遍历。可以使用for...of得到相应的值。

for (let [index,value] of [1,2,3].entries()){
    console.log(index,value);
}

for (let index of [1,2,3].keys()){
    console.log(index);
}

for (let value of [1,2,3].values()){
    console.log(value);
}

如果不使用for...of循环,可以手动调用遍历器对象的next方法,进行遍历

let letter = ['a', 'b', 'c'];
let entries = letter.entries();
console.log(entries.next().value); // [0, 'a']
console.log(entries.next().value); // [1, 'b']
console.log(entries.next().value); // [2, 'c']

includes()

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

[1, 2, 3].includes(2)     // true
[1, 2, 3].includes(4)     // false
[1, 2, NaN].includes(NaN) // true

方法的第二个参数表示搜索的起始位置,默认为0。

[1, 2, 3].includes(3, 3);  // false
[1, 2, 3].includes(3, -1); // true
ES6—数组方法的扩展 一、概述 ES6提供了很多高效的数组方法,详解如下所示。 二、详解 方法1:filter方法 filter方法不会改变原数组。 filter方法的作用是过滤目标数组,遍历数组的所有元素,并返回一个新数组,该数组包含所有符合筛选条件的数组元素,如果没有符合条件的数组元素则返回空数组。注意,filter方法不会检测空数组。 filter方法的语法如下所示。 array.filter((currentValue, index, arr) => { }, thisValue) filte 阅读详情

相关推荐

深入探究 ES6 数组扩展:扩展运算符的神奇应用与实战

ES6 对数组的扩展使得数组操作变得更加简洁、高效和灵活。扩展运算符...):用于数组复制、合并和函数参数传递。和Array.of():用于从类数组对象或其他可迭代对象创建数组。实例方法:如find()includes()flat()和flatMap(),大大提高了数组的处理能力。空值处理:可以使用等方式处理空值。排序稳定性:现代浏览器的sort()方法是稳定的,但老旧浏览器可能不稳定。这些特性可以显著提升开发效率和代码可读性。

向着太阳迎着光 1392

带你了解3个Python命令行工具

用 Click、Docopt 和 Fire 库写你自己的命令行应用。 有时对于某项工作来说一个命令行工具就足以胜任。命令行工具是一种从你的 shell 或者终端之类的地方交互或运行的程序。Git和Curl就是两个你也许已经很熟悉的命令行工具。 当你有一小段代码需要在一行中执行多次或者经常性地被执行,命令行工具就会很有用。Django 开发者执行./manage.py ru...

python学习者的博客 5121

ES6数组的解构赋值

<script> //数组的解构赋值 const arr1 = [1, 2, 3, 4] let [a, b, c, d] = arr1; //更加复杂的情况 const arr2 = [1, 2, 3, [4, 5, [6, 7]]]//如何拿到7 let [, , , [, , [, num]]] = arr2 console...

weixin_42281924的博客 198

MavLink协议入门

MAVLink是一个非常轻量化的开源的消息协议,用于无人机之间的通信以及无人机机载设备之间的通信。

ffffffeiyu的博客 2474

一种抑制undershoot/overshoot锐化算法介绍

一、USM 当增强图像的边缘、细节信息等高频信息时,图像的锐化视觉效果会得到较大提升。提高图像锐化的一种经典算法为非锐化掩码(UNsharp Masking)技术。该技术首先通过高通滤波并与缩放系数相乘,其结果再与原始图像相加,即可对高频信息进行增强。其主要的原理如下图所示: 其中,对图像进行高通滤波的另一种等效方法为:原始图像减去原始图像的低通滤波图像,其结果被称之为“掩码”。因此,上述的USM方法可以表示为: 原始图像减去原始图像低通滤波之后的图像得到掩码M。 2.掩...

大熊 4242

push方法

push方法push()方法的使用基本用法使用数组扩展将一个数组的元素依次添加到一个数组中使用call()或apply()在对象中使用push() push()方法的使用 push()方法在数组的尾部添加一个或多个元素,并返回数组新的长度,修改并替换了原始数组而非生成一个修改版的新数组。 基本用法 var total=[1,2,3]; var push=[4,5,6]; push.push(7,8...

辣辣的草莓酱 2万+

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | AAAI 2025 | 将 CEM 颜色增强模块引入RT-DETR ,目标检测不再惧怕雾天和低光检测、小目标检测、遥感目标检测高效涨点

本文提出了一种新型结构引导去雾网络(SGDN),通过双色引导桥(BGB)和色彩增强模块(CEM)有效解决雾霾图像去雾问题。BGB利用YCbCr空间的纹理特征引导RGB特征恢复,CEM通过聚合YCbCr通道信息增强RGB色彩感知。实验证明该方法在真实雾霾数据集上优于现有技术,能同时保持色彩准确性和纹理清晰度。文章还提供了完整的代码实现和模型配置指南,包括三种改进版RT-DETR网络结构(rtdetr-l/r18/r50-CEM.yaml),为图像去雾和目标检测任务提供了实用解决方案。

Ai缝合怪、助力小伙伴高效发论文 351

ES6、7、8中涉及数组新方法总结

** 先总结下ES6相关的数组方法: ** 1、.map: 映射,一个对一个 eg: [12, 58, 99, 86, 40, 91] [不及格, 不及格, 及格, 及格, 不及格, 及格] 2、.reduce: 汇总, 一堆出来一个 算总数 [12, 8000000, 599999] => 和为:80060011 算平均数 [12, 59, 99] => 5...

weixin_44349573的博客 947

谷歌A2A协议入门指南:附简易Python代码示例

继"关税"之后,当下最热门的词汇当属AI智能体——这种基于人工智能的软件能够执行复杂任务、实现工作流自动化并提升生产效率。但迄今为止,大多数智能体都处于各自为政的状态,难以顺畅协作。就像团队执行重大项目时,成员之间却无法交流!对于技术人员而言,一个可能遇到的典型场景是:假设你需要协调四个不同的AI服务——处理用户查询的Gemini智能体、在向量数据库进行搜索的AI应用、基于Claude的摘要生成器,以及运行专业领域逻辑的Python智能体。

独立开发,substack顶级编辑 797

ZYNQ工业级串口方案:AXI UART 16550扩展RS-485实战(自动方向控制+Linux驱动)

可以轻松扩展出多路工业级串口。但常规方案需要手动控制收发方向(DE/RE引脚),存在实时性差、CPU占用高等痛点。本文从硬件逻辑设计到Linux驱动开发,完整实现了ZYNQ平台的RS-485工业通信方案。,解决了传统方案实时性差的痛点。所有代码均经过实际项目验证,可直接用于生产环境。:尝试将此设计扩展为多协议兼容接口(支持RS-422/RS-232切换)!等特性,依然是现场总线通信的首选。,通过硬件逻辑+Linux驱动协同设计,实现零延迟切换。在工业自动化、能源电力等场景中,RS-485凭借。

QQ_778132974的博客 830

ES6-数组的扩展-数组实例的entries(),keys()和values()

ES6 提供三个新方法--entries(),keys() 和 values(),用于遍历数组。它们都返回一个遍历器对象,可以用 for...of 循环进行遍历,唯一的区别是 key() 是对键名的遍历、values() 是对键值的遍历,entries() 是对键值对的遍历。   for (let index of ['a', 'b'].keys()) { console.log(ind...

极北 1230

损失函数大汇总(四十三)(Boundary Loss附公式推导与代码)

摘要 Boundary Loss是一种针对图像分割任务的边界优化损失函数,特别适用于小目标、细长结构和类别不平衡场景。它通过引入真实边界的有符号距离场(SDF),将边界距离优化问题转化为区域积分形式。与Dice Loss等区域重叠损失不同,Boundary Loss更关注预测边界与真实边界的精确对齐,而非整体区域重叠。其核心公式为像素级SDF值与预测概率的乘积求和,通过梯度调整使预测概率在真实边界内部升高、外部降低。该损失通常与区域型损失(如CE或Dice)联合使用,形成"区域分割+边界修正&qu

悦学共鸣,温柔以待,汇聚光芒,共同成长 354

ES6 学习笔记3—7数值的扩展、8函数的扩展、9数组的扩展

这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。对象上面,行为完全保持不变。

BlackWolfSky的博客 267

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ES5~6~7 学习笔记数组扩展方法

1. indexOf(value) : 得到值在数组中的第一个下标 2. lastIndexOf(value) : 得到值在数组中的最后一个下标 3.forEach(function(item, index){}) : 遍历数组 4. map(function(item, index){}) : 遍历数组返回一个新的数组,返回加工之后的值 5. filter(function(item, ind...

诗水人间 15万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Es6学习笔记(7)----数组的扩展

参考书《ECMAScript 6入门》 http://es6.ruanyifeng.com/ 数组的扩展 1.扩展运算符:可以将数组转化成逗号隔离的单个参数 ...[1,2,3] //控制台运行报错 ...

weixin_39037804的博客 210

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ES6入门学习笔记

ES6学习笔记 学习开课吧 石川老师视频教程 兼容性 各大浏览器的最新版本,对 ES6 的支持可以查看kangax.github.io/compat-table/es6/。随着时间的推移,支持度已经越来越高了,超过 90%的 ES6 语法特性都实现了。 ES6(ES2015)——IE10+、Chorme、FirFox、移动端、NodeJS 编译转换: 在线转换 提前编译(babel==brows...

hen1183392934的博客 339

ES6之数组的扩展

TOC.../TOC。

BradenHan的专栏 921

数组扩展【ES6】

扩展运算符(数组的复制合并)、Array.from()、Array.of()、find()、findIndex()、fill()、flat()、flatMap()

qq_53002037的博客 834

包含ES6所有数组方法

      今晚学习《ES6标准入门(第3版)》第8章-数组的扩展,发现好多关于数组的方法已经忘的差不多了,赶紧连夜充下电。 1.arr.push() 从后面添加元素,返回值为添加完后的数组的长度 2.arr.pop() 从后面删除元素,只能是一个,返回值是删除的元素 3.arr.shift() 从前面删除元素,只能删除一个,返回值是...

Yaphets.Lee的博客 7942

ES6语法学习笔记(6)-数组扩展

ES6语法学习笔记(6)-数组扩展 Array.of不传值为空数组 { let arr = Array.of(3,4,7,9,11); console.log('arr=',arr);//arr= (5) [3, 4, 7, 9, 11] let empty=Array.of(); console.log('empty=',empty);//empty= [] } ...

qq_41537989的博客 235

ES6个人笔记记录——数组扩展

// 扩展运算符 console.log(1,...[2,3,4],5); // ES5 console.log(Math.max.apply(null,[14,2,48])); // ES6 let { max } = Math; console.log(max(...[14,2,48])); // ES5 var arr1 = [0,1,2]; var arr2 = [3,4,5]; co...

whmJack的博客 7万+

ES6和ES7之数组的扩展⽅法及扩展运算符的使⽤

简介:介绍ES6和ES7提供的新的数组⽅法及扩展运算符的使⽤ 扩展运算符的使⽤ … 复制数组 分割数组 将数组转化成参数传递给函数 新增的常⽤⽅法 fill find findIndex Includes flat filter { // 扩展运算符的使⽤ ... //复制数组的使用 // const list = [1,2,3,4,5] // const list2 =...

weixin_44415461的博客 226

ES6数组扩展

该方法主要应用于查找第一个符合条件的数组元素 ,它的参数是一个回调函数,在回调函数中可以写你要查找元素的条件,当条件成立为 true 时,返回该元素,如果没有符合条件的元素,返回值为 undefined。let arr2 = ["猪八戒", "孙悟空", "唐僧"].fill("kerwin", 1, 2);// chunwan('易烊千玺','王源','王俊凯')// ['猪八戒', 'kerwin', '唐僧']const tfboys = ['易烊千玺','王源','王俊凯'];

奋斗的小前端 999
上一篇: ES6学习笔记6 函数的扩展
下一篇: ES6学习笔记8 对象的扩展
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值