ES6中的扩展运算符

ES6中的扩展运算符ES6 的扩展运算符 它的语法很简单 使用三个点号表示 可以将一个数组转为用逗号分隔的参数序列 它将可迭代对象展开到其单独的元素中 所谓的可迭代对象就是任何能用 forof 循环进行遍历的对象 例如 数组 字符串 Map Set DOM 节点等 目录基础语法该运算符主要用于函数调用扩展运算符后面还可以放置表达式一 替代数组的 apply 方法使用 Math max 函数来获取最大值的用法是 使用

ES6中的扩展运算符

        ES6的扩展运算符,它的语法很简单,使用三个点号表示“…”。可以将一个数组转为用逗号分隔的参数序列。

        它将可迭代对象展开到其单独的元素中,所谓的可迭代对象就是任何能用 for of 循环进行遍历的对象,例如:数组、字符串、MapSetDOM节点等。

目录

基础语法

该运算符主要用于函数调用

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

一、 替代数组的 apply 方法

        使用 Math.max() 函数来获取最大值的用法是:

        使用 apply 方法结合 Math.max():

        ES6使用扩展运算符(…)就很简单就可以展开,上面的例子变为:

二、扩展运算符的应用 

1. 合并数组

        扩展运算符给了我们全新的合并数组的方法

2. 拷贝数组

3. 将伪数组转换为数组

4.与解构赋值结合

5. 字符串

6.Map 和 Set 结构,Generator 函数


基础语法

var array = [1,2,3,4]; console.log(...array);//1 2 3 4 var str = "String"; console.log(...str);//S t r i n g

该运算符主要用于函数调用

function push(array, ...items) { array.push(...items); } function add(x, y) { return x + y; } const numbers = [4, 38]; add(...numbers) // 42

        上面代码中,array.push(...items)add(...numbers)这两行,都是函数的调用,它们都使用了扩展运算符。该运算符将一个数组,变为参数序列。 

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

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

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

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

扩展运算符还有许多用法…

一、 替代数组的 apply 方法

        使用 Math.max() 函数来获取最大值的用法是:

const m = Math.max(1, 2, 3); //结果为3

        使用 apply 方法结合 Math.max():

        但如果要计算数组里的最大值,显然数组是不能直接作为 Math.max() 的参数,我们需要把它展开。在ES6之前,我们也是需要结合apply来处理:

var arr = [2, 4, 8, 6, 0]; function max(arr) { return Math.max.apply(null, arr); } console.log(max(arr));

        ES6使用扩展运算符(…)就很简单就可以展开,上面的例子变为:

var arr = [2, 4, 8, 6, 0]; console.log(Math.max(...arr)); // 3

二、扩展运算符的应用 

1. 合并数组

        扩展运算符给了我们全新的合并数组的方法

// ES5 apply 写法 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; Array.prototype.push.apply(arr1, arr2); //arr1 [0, 1, 2, 3, 4, 5]

        使用扩展运算符就可以很简单地把数组展开为参数列表

const a1 = [{ foo: 1 }]; const a2 = [{ bar: 2 }]; const a3 = a1.concat(a2); const a4 = [...a1, ...a2]; a3[0] === a1[0] // true a4[0] === a1[0] // true

       上面代码中,a3a4是用两种不同方法合并而成的新数组,但是它们的成员都是对原数组成员的引用,这就是浅拷贝。如果修改了引用指向的值,会同步反映到新数组。

        注意:这两种方法都是浅拷贝,使用的时候需要注意。

2. 拷贝数组

        数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。

        ES5 只能用变通方法来复制数组。

const a1 = [1, 2]; const a2 = a1.concat(); a2[0] = 2; a1 // [1, 2]

        上面代码中,a1会返回原数组的克隆,再修改a2就不会对a1产生影响。 

        扩展运算符提供了复制数组的简便写法。

//拷贝数组 var array0 = [1,2,3]; var array1 = [...array0]; console.log(array1);//[1, 2, 3] ​ //拷贝数组 var obj = { age:1, name:"lis", arr:{ a1:[1,2] } } var obj2 = {...obj}; console.log(obj2);//{age: 1, name: "lis", arr: {…}}

       记住:数组仍通过指针得到,所以我们并没有复制数组本身,我们复制的只是一个新的指针。

3. 将伪数组转换为数组

NodeList 对象是节点的集合,通常是由属性,如 Node.childNodes 和方法,如 document.querySelectorAll 返回的。

        像 NodeList 和 arguments 这种伪数组,类似于数组,但不是数组,没有 Array 的所有方法,例如findmapfilter 等,但是可以使用 forEach() 来迭代

        可以通过扩展运算符将其转为数组,如下:

const nodeList = document.querySelectorAll(".row"); const nodeArray = [...nodeList]; console.log(nodeList); console.log(nodeArray);

        注意:使用扩展运算符将伪数组转换为数组有局限性,这个类数组必须得有默认的迭代器且伪可遍历的

4.与解构赋值结合

        扩展运算符可以与解构赋值结合起来,用于生成数组

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

下面是另外一些例子:

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 // []

        注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。

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

5. 字符串

        ES6的扩展语法可以很简单的把一个字符串分割为单独字符的数组:

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

6.Map 和 Set 结构,Generator 函数

        扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Map 结构。

let map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let arr = [...map.keys()]; // [1, 2, 3]

        Generator 函数运行后,返回一个遍历器对象,因此也可以使用扩展运算符。

var go = function*(){ yield 1; yield 2; yield 3; }; [...go()] // [1, 2, 3]

        上面代码中,变量go是一个 Generator 函数,执行后返回的是一个遍历器对象,对这个遍历器对象执行扩展运算符,就会将内部遍历得到的值,转为一个数组。

        如果对没有 Iterator 接口的对象,使用扩展运算符,将会报错。

const obj = {a: 1, b: 2}; let arr = [...obj]; // TypeError: Cannot spread non-iterable object

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230643.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月11日 下午4:01
下一篇 2026年2月11日 下午4:22


相关推荐

  • 实验设备管理系统C语言_实验室设备管理系统代码

    实验设备管理系统C语言_实验室设备管理系统代码这里写目录标题实验室设备管理系统题目要求源代码运行结果实验室设备管理系统题目要求实验设备管理系统设计实验设备信息包括:设备编号,设备种类(如:微机、打印机、扫描仪等等),设备名称,设备价格,设备购入日期,是否报废,报废日期等。主要功能:(1)能够完成对设备的录入和修改(2)对设备进行分类统计(3)设备的破损耗费和遗损处理(4)设备的查询要求:使用文件方式存储数据。源代码#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#i

    2022年10月13日
    5
  • .bat批处理基础

    .bat批处理基础批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat。目前比较常见的批

    2022年7月3日
    27
  • Linux命令每五分钟执行一次,Linux crontab 每5秒钟执行一次 shell 脚本 的方法

    Linux命令每五分钟执行一次,Linux crontab 每5秒钟执行一次 shell 脚本 的方法Linuxcrontab 每 5 秒钟执行一次 shell 脚本的方法由于 Linux 的 crontab 的定时命令格式如下 minutehourda of monthmonth of yearday of weekcommands 意味着标椎定时任务中 最小定时周期是分钟 但是 由于实际应用中 可能需要每 5 秒就要求执行某个 shell 脚本 该如何实现呢 本文中提供如下方式 间隔调用 sh

    2026年3月26日
    1
  • java rmi与dubbo

    java rmi与dubbo首先得知道什么是分布式,以及和集群的区别?分布式:一个业务分拆成多个子业务,部署在不同的服务器上,多半是为了业务解耦,不同的业务可以分别部署,互不干扰,只在需要时相互调用,提升效率。集群:同一个业务,部署在多个服务器上,多半是为了解决高并发,高访问量,提高系统性能。RMIRMI(RemoteMethodInvocation)即远程方法调用,是java在JDK1.1中实现的一…

    2022年6月16日
    37
  • 卡巴斯基2月病毒及恶意软件排行榜

    卡巴斯基2月病毒及恶意软件排行榜互联网“热门”木马病毒排名下面显示了在2009年2月期间,中国地区的互联网上木马病毒的活跃情况。表中所列的都是最常遇到的恶意程序。这些恶意程序会在用户上网的同时给用户带来危害。(下表中的数据根据卡巴斯基产品检测情况统计得出)Nameofmalware % pp1. not-a-virus:AdWare.Win32.BHO.fay     7.69 +102. HEUR:Trojan…

    2022年7月25日
    15
  • OpenClaw 教學 2026:從安裝到進階部署完全指南

    OpenClaw 教學 2026:從安裝到進階部署完全指南

    2026年3月13日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号