ES6扩展运算符的使用方法示例

目录
  • 什么是spread 和rest运算符
  • 数组的扩展运算符
    • rest运算符(收集作用)
    • spread运算符(展开作用)
  • 对象的扩张运算符
    • 浅克隆
    • 深克隆
  • 总结

什么是spread 和rest运算符

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

数组的扩展运算符

rest运算符(收集作用)

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

function sum(){
	let sumNumber=0;
    for(let i=0;i<arguments.length;i++){
        sumNumber += arguments[i];
    }
    return sumNumber;
}
console.log(sum(1,2,3));	//6
console.log(sum(4,5,6,7,8));	//30

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

function sum(...arg){
	let sumNumber=0;
   	arg.forEach(function(ele){
        sumNumber+=ele;
    })
    return sumNumber;
}
console.log(sum(1,2,3));	//6
console.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扩展运算符的文章就介绍到这了,更多相关ES6扩展运算符内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • es6数组之扩展运算符操作实例分析

    本文实例讲述了es6数组之扩展运算符操作.分享给大家供大家参考,具体如下: 扩展运算符(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')] 该运算符主要用于函数调用. function push(array, ...it

  • JavaScript 扩展运算符用法实例小结【基于ES6】

    本文实例讲述了JavaScript 扩展运算符用法.分享给大家供大家参考,具体如下: 扩展运算符格式 扩展运算符格式很简单,就是三个点(-) 重点:需要ES6 语法支持 扩展运算符作用??? 扩展运算符允许一个表达式在期望多个参数(用于函数调用)或多个元素(用于数组字面量)或多个变量(用于解构赋值)的位置扩展. 1.将一个数组放入另一个数组中 下面开始通过四个例子来深刻理解扩展运算符 ①. 创建一个数组middle ②. 创建第二个包含middle的数组 ③. 输出结果 var middle =

  • es6中的解构赋值、扩展运算符和rest参数使用详解

    前言 本文主要给大家介绍了关于es6中解构赋值.扩展运算符和rest参数使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. es6中较为常用的书写风格 为了书写的方便,es6中提出了很多比较友好的书写方式,其中最为常见的属于以下几个: 字符串模板 `abcdef${test}` 解构赋值 let [a, b, c] = [1, 2, 3] 扩展运算符 rest参数 ... 本文希望能够学习其中的主要的用法,方便书写和简洁性. 字符串模板 在以前的日子,我们经常捡到各

  • ES6扩展运算符和rest运算符用法实例分析

    本文实例讲述了ES6扩展运算符和rest运算符用法.分享给大家供大家参考,具体如下: 运算符可以很好的为我们解决参数和对象数组未知情况下的编程,让我们的代码更健壮和简洁. 运算符有两种:对象扩展运算符与rest运算符. 1.对象扩展( spread)运算符(...) (1)解决参数个数问题 以前我们编程是传递的参数一般是确定,否则将会报错或者异常,如下: function test(a,b,c,d) { console.log(a) console.log(b) console.log(c) c

  • ES6中的rest参数与扩展运算符详解

    前言 本文主要给大家介绍了关于ES6中rest参数与扩展运算符的相关内容,rest参数和扩展运算符都是ES6新增的特性.rest参数的形式为:...变量名:扩展运算符是三个点(...).下面话不多说了,来一起看看详细的介绍: rest参数 rest参数用于获取函数的多余参数,这样就不需要使用arguments对象了.rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中. function add(...values) { let sum = 0; for (var val of val

  • ES6扩展运算符用法实例分析

    本文实例讲述了ES6扩展运算符用法.分享给大家供大家参考,具体如下: 扩展运算符用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值,扩展运算符有以下几点作用 一.展开数组 //展开数组 let a = [1,2,3,4,5], b = [...a,6,7]; console.log(b); //打印出来的值[1, 2, 3, 4, 5, 6, 7] 二.数组的拷贝 //数组的拷贝 var c = [1, 2, 3]; var d = [...c]; d.push(4); cons

  • ES6扩展运算符的用途实例详解

    ES6的扩展运算符可以说是非常使用的,在给多参数函数传参,替代Apply,合并数组,和解构配合进行赋值方面提供了很好的便利性. 扩展运算符就是三个点"...",就是将实现了Iterator 接口的对象中的每个元素都一个个的迭代并取出来变成单独的被使用. 看这个例子: console.log(...[3, 4, 5]) 结果: 3 4 5 调用其实就是: console.log(3, 4, 5) 合并数组 可以使用扩展运算符将多个数组进行合并. let arr1 = [1, 2, 3]

  • 详解ES6 扩展运算符的使用与注意事项

    扩展运算符 spread syntax 又叫展开语法,写法是 ...,顾名思义,其实是用来展开字符串,数组和对象的一种语法,可以在函数调用/数组构造时, 将数组表达式或者 string 在语法层面展开:还可以在构造字面量对象时, 将对象表达式按 key-value 的方式展开.常用的语法如下: //函数调用: myFunction(...iterableObj); //字面量数组构造或字符串: [...iterableObj, '4', ...'hello', 6]; // 构造字面量对象时,进

  • ES6扩展运算符的使用方法示例

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

  • ES6扩展运算符的理解与使用场景

    目录 1.替代apply方法,一般在函数调用时处理参数 2.剩余参数(rest运算符),主要针对函数形参 3.数据连接.合并 4.数组和对象的拷贝 5.字符串转数组 6.在函数调用时使用拓展运算符. 总结 扩展运算符,即...运算符是es6新增的一个语法,其主要作用是将数组或对象进行展开(这种说法也许不太准确),希望通过下面的总结能让你明白其使用方法. 个人的理解和总结使用场景如下: 1.替代apply方法,一般在函数调用时处理参数 假设我们的参数刚好是一个数组(单个参数这里就不讨论了,逐个传入

  • PHP使用openssl扩展实现加解密方法示例

    从PHP7版本开始很多依赖mcrypt扩展的方法都不支持了,PHP7.2.0及以上版本已经完全不支持mcrypt扩展的任何方法了,所以PHP7及以上版本都应该使用openssl扩展来实现加解密. 以DES-CBC加密方式为例: <?php class DesUtil { /** * Des 加密 * * @param $str * @param $secretKey * @param string $iv * @return string */ public static function en

  • JS ES新特性 扩展运算符介绍

    一.扩展运算符 扩展运算符是三个点... , 允许将一个表达式原地展开,当需要多个参数(比如函数的调用时) 或者多个值(比如数组)它会将其转为用逗号分隔的参数序列. 示例代码如下所示: // 定义一个数组 let arr = [1, 2, 3, 4, 5, 6] // 使用 ... 扩展运算符展开 console.log(...arr); // 1 2 3 4 5 6 // 定义一个函数 function fun(...item) { console.log(...item); } // 调用函

随机推荐