一起来聊聊ES6中的扩展运算符

本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于扩展运算符的相关问题,s6的扩展运算符,它的语法很简单,使用三个点号表示“…”。可以将一个数组转为用逗号分隔的参数序列,下面一起来看一下,希望对大家有帮助。

一起来聊聊ES6中的扩展运算符

【相关推荐:javascript视频教程、web前端】

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

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

基础语法

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] // truea4[0] === a1[0] // true

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

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

2. 拷贝数组

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

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

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

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

一览运营宝 一览运营宝

一览“运营宝”是一款搭载AIGC的视频创作赋能及变现工具,由深耕视频行业18年的一览科技研发推出。

一览运营宝 41 查看详情 一览运营宝

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

//拷贝数组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.与解构赋值结合

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

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

下面是另外一些例子:

const [first, ...rest] = [1, 2, 3, 4, 5];first // 1rest  // [2, 3, 4, 5]const [first, ...rest] = [];first // undefinedrest  // []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

【相关推荐:javascript视频教程、web前端】

以上就是一起来聊聊ES6中的扩展运算符的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/546825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
提升电脑网速:解决网络缓慢问题的终极指南
上一篇 2025年11月9日 18:07:34
曝苹果研发工作结束,主推国行版折叠屏 iphone
下一篇 2025年11月9日 18:07:40

相关推荐

  • JavaScript设计原则_JavaScript可维护代码

    每个函数应只做一件事,如拆分数据处理与DOM操作,命名体现功能(如formatDate),长度控制在20行内;2. 使用清晰命名(如currentUser、isValid)减少注释依赖,关键逻辑注明“为什么”;3. 按功能模块化组织代码,如api.js处理请求,utils.js存放工具函数,使用im…

    2026年5月10日
    000
  • JavaScript中为动态列表元素创建唯一悬停描述的教程

    本教程旨在解决如何为动态生成的列表或数组元素分配唯一悬停描述(tooltip)的问题。文章将深入探讨使用javascript对象和map数据结构来高效地管理名称与描述的映射关系,并提供具体的代码示例,以实现每个列表项在鼠标悬停时显示不同的自定义信息,同时兼顾性能与数据顺序的需求。 在网页开发中,我们…

    2026年5月10日
    000
  • JavaScript模块化是什么_ES6模块和CommonJS有什么区别呢

    JavaScript模块化将代码拆分为独立可复用单元,ES6模块(import/export,编译时加载、实时引用)与CommonJS(require/module.exports,运行时加载、值拷贝)核心区别在于设计目标和运行机制不同。 JavaScript模块化是把代码按功能拆分成独立、可复用的…

    2026年5月10日
    000
  • JavaScript中动态生成HTML链接:正确使用模板字面量嵌入URL

    本文深入探讨了在javascript中动态生成html链接时,如何正确地将变量(尤其是url)嵌入到`href`属性中。通过分析常见的错误,即混淆javascript的模板字面量与框架特有的模板语法,文章详细演示了使用es6模板字面量`${}`进行字符串插值的正确方法,确保动态链接能够被浏览器正确解…

    2026年5月10日
    000
  • JavaScript模块化开发有哪些方法?

    JavaScript模块化开发主要有四种方法:1. CommonJS(Node.js默认,同步加载,导出值拷贝);2. AMD(浏览器异步设计,依赖前置);3. CMD(就近依赖,延迟加载);4. ES6 Module(标准规范,静态分析、实时绑定、原生支持,推荐新项目使用)。 JavaScript…

    2026年5月10日
    000
  • 将HTML动态表格多行数据保存到Google Sheet的教程

    本教程旨在解决html表单动态添加多行数据时,google apps script web app仅保存第一行数据的问题。核心解决方案是利用`e.parameters`(复数)获取所有同名输入字段的值数组,并通过修改apps script的`dopost`函数,将这些数据结构化为多行,一次性写入go…

    2026年5月10日
    000
  • 使用共享状态和Proxy模式管理多事件监听器间的逻辑依赖

    当多个事件监听器之间存在隐式逻辑依赖时,代码的可读性和维护性会显著下降。本文介绍一种通过共享状态对象来明确管理这些依赖的教程,特别是在处理如元素拖拽等复杂交互时。我们将演示如何利用javascript的proxy对象,以一种解耦且可控的方式,响应状态变化并执行相应的操作,从而构建结构清晰、易于理解的…

    2026年5月10日
    000
  • JavaScript 原型链:理解原型继承与属性查找机制

    JavaScript通过原型链实现继承,对象属性查找会沿原型链向上搜索。每个构造函数有prototype指向原型对象,实例通过__proto__链接到原型,共享其属性和方法。例如Person构造函数的原型添加greet方法,其实例john可调用该方法,实际访问的是Person.prototype中的…

    2026年5月10日
    000
  • 优化JavaScript大型数组:高效重构map与filter以获取唯一值

    本文探讨了在处理大型javascript数组时,如何高效地结合`map`和`filter`操作以获取唯一值。针对传统`filter`结合`indexof`或`reduce`结合`includes`在数据量巨大时出现的性能瓶颈,本文推荐使用内置的`set`数据结构,它能以显著提升的效率解决重复值问题,…

    2026年5月10日
    000
  • javascript如何操作字符串_常用的字符串方法有哪些

    JavaScript字符串操作方法均不修改原字符串,而是返回新值:包括查找(indexOf、includes)、截取(slice)、大小写转换(toLowerCase)、去空格(trim)、分割拼接(split/join)、替换(replace/replaceAll)等。 JavaScript 中操…

    2026年5月10日
    000
  • 如何创建函数_javascript中有哪些方式?

    JavaScript创建函数有四种方式:函数声明(具名、可提升)、函数表达式(匿名或具名、不可提升)、箭头函数(无this/arguments、不可构造)、Function构造函数(动态生成、性能差)。 在 JavaScript 中创建函数主要有四种常用方式,每种适用场景不同,理解区别能帮你写出更清…

    2026年5月10日
    000
  • JS插件如何实现模块化_JS插件模块化开发方法与最佳实践

    采用ES6模块化规范可提升JS插件的可维护性与复用性,通过合理拆分功能模块、设计可配置接口并结合构建工具打包发布,实现高效协作与多环境兼容。 在现代前端开发中,JS插件的模块化不仅能提升代码可维护性,还能增强复用性和协作效率。实现模块化的关键在于合理组织代码结构、使用标准模块规范,并遵循清晰的设计原…

    2026年5月10日
    000
  • JavaScript:高效比较两个对象中对应数组值的长度

    本教程详细讲解如何在javascript中高效地比较两个对象,确保它们所有相同键对应的数组值具有相同的长度。文章将深入探讨 `object.entries()` 和 `array.prototype.every()` 的结合使用,并通过解构赋值优化代码,避免常见的编程陷阱。我们将提供清晰的代码示例,…

    2026年5月10日
    000
  • JavaScript中的严格模式(use strict)详解_javascript基础

    严格模式是通过在脚本或函数顶部添加”use strict”来启用的编译指令,使JavaScript代码在更严格的条件下运行。它禁止意外创建全局变量、函数内this指向全局对象、删除不可配置属性、重复函数参数名等行为,并限制arguments、eval等关键字的使用,提升代码安…

    2026年5月10日
    000
  • JavaScript中的迭代器与生成器详解_js ES6+

    迭代器是遵循迭代器协议的对象,提供next()方法返回{value, done};2. 生成器函数用function*定义,通过yield暂停并返回值,自动实现迭代器接口。 在JavaScript ES6+中,迭代器(Iterator)和生成器(Generator)是处理数据序列的重要机制。它们让开…

    2026年5月10日
    100
  • 使用JS动态生成HTML时如何管理状态_使用JS动态生成HTML时如何管理状态策略

    答案:管理JavaScript动态生成HTML的状态需以数据驱动UI。1. 使用单一数据源确保状态集中,如将用户信息存于对象中,更新时先改数据再重新渲染;2. 封装状态与逻辑,用类组织数据和方法,调用方法后自动刷新视图;3. 借鉴响应式模式,通过Proxy监听状态变化并自动更新界面;4. 避免频繁直…

    2026年5月10日
    000
  • html5如何实现弹窗_HTML5模态框弹窗实现步骤与代码【弹窗】

    可使用HTML5 dialog元素、div+CSS+JS手动实现、:target伪类无JS方案或SweetAlert2等第三方库创建强制交互弹窗;其中dialog语义清晰且原生支持模态行为,其余方案侧重兼容性、轻量性或功能丰富性。 如果您希望在网页中创建一个用户无法绕过、必须交互的弹窗界面,则可以使…

    2026年5月10日
    000
  • JavaScript中的数组去重有哪些高效算法?

    使用Set去重适用于基本类型,代码简洁性能好;Map适合对象数组按属性去重,灵活但内存占用高;双指针法用于已排序数组,空间复杂度低。 JavaScript中数组去重的高效方法取决于数据类型和性能需求。以下是几种常用且高效的实现方式。 使用 Set 去重(推荐) ES6 引入的 Set 数据结构天然支…

    2026年5月10日
    000
  • JavaScript精确筛选ID带特定数字模式的DOM元素

    本文详细阐述如何利用JavaScript的document.querySelectorAll结合数组的filter方法和正则表达式,高效且精确地筛选出ID以特定数字模式结尾的DOM元素。该方法解决了纯CSS选择器无法处理复杂ID模式的局限性,确保仅匹配符合严格数字后缀规则的元素,从而提高DOM操作的…

    2026年5月10日
    100
  • JavaScript条件隐藏计数器:当值为0时隐藏元素

    本教程将指导您如何使用纯javascript动态管理网页上的计数器显示。我们将学习如何获取特定元素的数量,并将该数量显示在指定的“元素中。更重要的是,当计数为零时,我们将实现一种机制来自动隐藏相应的“元素,从而优化用户界面,避免显示不必要的零值,并融入现代javascript…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信