这期内容当中小编将会给大家带来有关如何正确的使用ES6扩展运算符,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
扩展运算符<代码> 代码>语法传播又叫展开语法,写法是……,顾名思义,其实是用来展开字符串,数组和对象的一种语法,可以在函数调用/数组构造时,将数组表达式或者<代码>字符串> 代码在语法层面展开;还可以在构造字面量对象时,将对象表达式按<代码>键值> 代码的方式展开。常用的语法如下:
//函数调用: myFunction (…iterableObj);//字面量数组构造或字符串: […iterableObj & # 39; 4 & # 39;……& # 39;你好# 39;6);//构造字面量对象时,进行克隆或者属性拷贝(ECMAScript 2018规范新增特性): 让objClone={…obj};
在函数调用时使用扩展运算符相当于使用<代码> Function.prototype。应用代码>:
函数myFunction (x, y, z) {} var args=(0, 1, 2); myFunction (…args);//相当于 函数myFunction (x, y, z) {} var args=(0, 1, 2); myFunction。应用(null, args);
和<代码> 代码>应用不同的是,我们不仅可以将全部参数放到一个数组中,还可以只将其中几个参数用扩展运算符展开,并且可以再一次调用中多次使用扩展运算符。
函数myFunction (a, b, c, d, e) { 控制台。日志(a, b, c, d, e);//1 0 1 2 3 console.log(参数);//静问縶& # 39;0 & # 39;:1 & # 39;1 & # 39;:0,& # 39;2 & # 39;:1 & # 39;3 & # 39;:2 & # 39;4 & # 39;:3} } var args=[0, 1]; myFunction (1,…args, 2,…[3]);
使用<代码> 代码>新关键字来调用构造函数时,不能直接使用数组加上<代码> 代码>应用的方式(<代码> 代码>申请执行的是调用<代码>[[说]]> 代码,而不是构造<代码>[[制造]])> 代码。有了展开语法,将数组展开为构造函数的参数就很简单了:
var datefield=[1970, 0, 1];//1970年1月1日 var d=新的日期(…datefield);
如果想要不使用扩展运算符实现同样的效果,我们必须用一个函数包装构造函数,将这个新的构造函数的<代码> 代码>原型设为原构造函数的实例,用<代码> Object.create (constructor.prototype)> 代码(这里主要是为了新构造函数原型的修改不影响原构造函数的原型,直接用<代码>构造函数。> 原型代码作为新构造函数的原型也可以实现)。
函数applyAndNew(构造函数,args) { 函数部分(){ 构造函数返回。应用(这个,args); } 如果类的构造函数。===& # 39;原型对象# 39;){ 部分。原型=Object.create (constructor.prototype); } 返回部分; } 函数myConstructor () { console.log(& # 39;参数。长度:& # 39;+ arguments.length); console.log(参数); 这一点。prop1=& # 39; val1 # 39;; 这一点。prop2=& # 39; val2 # 39;; } var myArguments=[& # 39;你好# 39;& # 39;与# 39;,& # 39;是# 39;,& # 39;你们# 39;,& # 39;先生# 39;,null); var myConstructorWithArguments=applyAndNew (myConstructor myArguments); 控制台。日志(新myConstructorWithArguments ());//(myConstructor构造函数中):参数。长度:6//(myConstructor构造函数中):[“hi",“how",“are",“你:,“mr",零)//(“新myConstructorWithArguments"中):{prop1:“val1" prop2:“val2"}
当然用的最多的还是在字面量数组上,没有展开语法的时候,只能组合使用,拼接,concat等方法,来将已有数组元素变成新数组的一部分。有了展开语法,通过字面量方式,构造新数组会变得更简单,更优雅:
可以用来实现数组浅拷贝:
arr var=(1、2、3); var arr2=arr […];//像arr.slice () arr2.push (4);//arr2此时变成(1、2、3、4)//加勒比海盗不受影响连接多个数组:
var arr1=(0, 1, 2); var arr2=(3、4、5); var arr3=[…arr1……arr2);扩展运算符还可以将已有对象的所有可枚举(<代码>可列举的> 代码)属性拷贝到新构造的对象中。该方法为浅拷贝,可以拷贝<代码> 代码>象征属性,但不包含原型上的属性和方法。如果同时拷贝多个对象,后面的对象会覆盖前面对象的同名属性。
var其中obj1={foo: & # 39;酒吧# 39;,x: 42岁(符号(& # 39;一个# 39;)]:123}; var methoda={foo: & # 39;巴兹# 39;,x: 100年,杨:13}; var clonedObj={…其中obj1}; console.log (clonedObj);//{foo: & # 39;酒吧# 39;,x: 42岁[符号(a)]: 123} var mergedObj={…其中obj1,……methoda}; console.log (mergedObj);//{foo: & # 39;巴兹# 39;,x: 100年,杨:13日[符号(a)]: 123}如何正确的使用ES6扩展运算符