千家信息网

ES6扩展运算符如何使用

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,这篇"ES6扩展运算符如何使用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"ES6扩
千家信息网最后更新 2025年11月11日ES6扩展运算符如何使用

这篇"ES6扩展运算符如何使用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"ES6扩展运算符如何使用"文章吧。

    什么是spread 和rest运算符

    spread和rest运算符在ES6中,都用(...)表示,其中spread为扩展(展开)运算符,rest为剩余(收集)运算符。在不同的地方使用此运算符有不同的作用,可以从读和写两个角度考虑。其中写操作有收集作用,读操作有展开作用。在ES6中,(...)运算符只对数组有效,ES7中添加了对对象的扩展。

    数组的扩展运算符

    rest运算符(收集作用)

    在没有时使用(...)运算符时,要实现一个求和的功能函数,传入的参数不定,只能使用arguments。例如:

    function sum(){        let sumNumber=0;    for(let i=0;i

    当使用rest运算符时,我们的代码可以简洁很多:

    function sum(...arg){        let sumNumber=0;         arg.forEach(function(ele){        sumNumber+=ele;    })    return sumNumber;}console.log(sum(1,2,3));        //6console.log(sum(4,5,6,7,8));    //30

    此时传入的参数将会被写入到arg中,并且形成一个数组。我们可以打印arg:

    function sum(...arg){    console.log(arg);}console.log(sum(1,2,3));        // (3) [1, 2, 3]console.log(sum(4,5,6,7,8));    //(5) [4, 5, 6, 7, 8]

    如果我们传入的参数有必须要传入的项,我们可以在形参的最后一位使用rest运算符:

    function test(a, b, ...arg) {        console.log(a,b,arg);}test(1,2,3,4,5,6,7,8);//1 2 (6) [3, 4, 5, 6, 7, 8]

    可以看到输出的a,b为实参的前两项,后面传入的参数都被转化为数组存入到arg中。

    spread运算符(展开作用)

    let arr=[1,2,3,4,5];console.log(arr);       //(5) [1, 2, 3, 4, 5]console.log(...arr);    // 1 2 3 4 5

    可以看到,当使用了(...)运算符时,它会将数组展开并输出。

    当我们想将数组合并时,传统的做法:

    let arr1=[1,2,3];let arr2=[5,6,7,8];let arr3=[].arr3.concat(arr1,arr2);        //相当于let arr3=new Array();arr3.concat(arr1,arr2);console.log(arr3);      //(7) [1, 2, 3, 5, 6, 7, 8]

    使用(...)运算符的做法:

    let arr1=[1,2,3];let arr2=[5,6,7,8];let arr3=[...arr1,...arr2];console.log(arr3);      //(7) [1, 2, 3, 5, 6, 7, 8]

    我们来看看它是怎么实现的,我们可以使用babel来将ES6语法转换为ES5:

    "use strict";var arr1 = [1, 2, 3];var arr2 = [5, 6, 7, 8];var arr3 = [].concat(arr1, arr2);

    可以看到它的实现原理也是数组的concat方法。所以(...)运算符是一个语法糖,不会影响原来的功能。

    对象的扩张运算符

    浅克隆

    在ES7中,(...)运算符支持对对象的扩张。

    let school={           name:"xxx大学",    history:"50"};let teacher={    leader:{        name:"xx校长",        age:"40",    },    personNum:60};

    我们如果想要将上述对象克隆到另一个对象中,传统的做法是自己写一个clone函数,或者使用jQuery中的extend方法。现在我们只需要使用(...)运算符即可完成。

    let obj={    ...school,    ...teacher}console.log(obj);       /*  Object                                        history: "50"                                        leader: {name: "xx校长", age: "40"}                                        name: "xxx大学"                                        personNum: 60                                        __proto__: Object*/

    可以看到,使用(...)运算符可以轻易的完成克隆,但此克隆是一个浅克隆。例如:

    obj.leader.name="xxx";console.log(obj);       /*history: "50"                                        leader: {name: "xxx", age: "40"}                                        name: "xxx大学"                                        personNum: 60                                        __proto__: Object */console.log(teacher); /*leader: {name: "xxx", age: "40"}                                                personNum: 60                                                __proto__: Object */

    在ES6中也有一个浅克隆的方法:Object.assign({ },obj1,obj2,...)

    它会将后面的对象克隆到第一个对象里。

    let school={      name:"xxx大学",    history:"50"};let teacher={    leader:{        name:"xx校长",        age:"40",    },    personNum:60};let obj={};Object.assign(obj,school,teacher);console.log(obj);       /*history: "50"                                        leader: {name: "xx校长", age: "40"}                                        name: "xxx大学"                                        personNum: 60                                        __proto__: Object*/

    可以看到也完成了克隆。

    深克隆

    当我们修改obj中leader的name值时,原来teacher对象中相应的值也发生了改变。如果想要实现深克隆,我们可以对修改一下上述代码:

    let school={         name:"xxx大学",    history:"50"};let leader={     name:"xx校长",       age:"40",}let teacher={    leader:{        ...leader    }    personNum:60};let obj={    ...school,    ...teacher,    leader:{        ...leader    }}console.log(obj);       /*history: "50"                                        leader: {name: "xx校长", age: "40"}                                        name: "xxx大学"                            personNum: 60                                        __proto__: Object*/obj.leader.name="xxx";cosnole.log(obj);       /*history: "50"                                        leader: {name: "xxx", age: "40"}                                        name: "xxx大学"                                        personNum: 60                                        __proto__: Object*/console.log(leader);.   /*age: "40"                                                name: "xx校长"                                                __proto__: Object*/console.log(teacher);   /*leader: {name: "xx校长", age: "40"}                                                personNum: 60                                                __proto__: Object*/

    可以看到,我们改变了obj中leader的name值,只在obj对象中发生了改变,teacher对象和leader对象并没有发生改变。
    如果有很多层的引用值,并不推荐此方法,可以自己书写一个深克隆方法,当然也有另一个方法,比较另辟蹊径。可以使用JSON先将要克隆的对象转化为一个字符串,然后再转化为对象,这样新得到的对象和原来得对象也没有关系。

    let teacher={    leader:{        name:"xx校长",             age:"40",    }    personNum:60};let obj=JSON.parse(JSON.stringify(teacher));console.log(obj);       /*leader: {name: "xx校长", age: "40"}                                        personNum: 60                                        __proto__: Object*/obj.leader.name="xxx";console.log(obj.leader.name);   //"xxx"console.log(teacher.leader.name);       //"xx校长"

    但是这个方法对含有函数(function())、正则(reg)、特殊对象(new Data())的对象进行克隆时,会丢失上面所说的属性。如果没有上面的属性,可以使用此方法。

    以上就是关于"ES6扩展运算符如何使用"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

    运算符 运算 对象 校长 大学 数组 方法 作用 内容 参数 做法 函数 不同 代码 传统 功能 属性 文章 此方法 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全万无一失是什么意思 在关系数据库中实现表中 怎么查看计算机数据库 网络安全等级怎么升 英伟达中国服务器 美萍美发管理系统服务器名称 职中网络技术专业做什么 聊天记录迁移后原来数据库 电脑游戏服务器怎么使用 技术支持数据库需要会编程吗 蛋白互作网络数据库 智能化软件开发费用是多少 无线网络技术的原理与应用 美国队长数据库 查看网络监听数据库 网络安全有哪两个方面的含义 网络安全工作汇报县委宣传部 access数据库导出指定表格 手游服务器租赁网站 单人舞视频软件开发 数据库去重处理用什么函数 医院网络安全责任书个人 年度网络安全事件应急演练预案 数据库什么产品安全度最高 温州盘古网络技术有限公司 配置数据库安全对象 服务器集群安全 牙克石租房软件开发 网络安全发考试及答案 关系数据库中子模式称为
    0