[js学习]扩展运算符的用法

一.将数组元素在函数中调用

如果不用扩展语法的话,我们将数组元素传入函数一般是用Function.prototype.apply( )方法

例如

function plus(a,b,c){return a+b+c};
var nums=[1,2,3];
 plus.apply(null,nums)//6

如果用扩展语法写的话,可以写成

function plus(a,b,c){return a+b+c};
var nums=[1,2,3];
plus(...nums)//6

参数列表中的任何参数都可以使用扩展语法,并且可以多次使用。

二、在 new 中应用

当用new调用构造函数,它不可能直接使用数组和  apply (apply做了[[Call]],而不是一个[[Construct]])。然而,借助新的扩展语法可以轻松使用:

var dateFields = [1970,0,1]; // 1970年1月1日
var d = new Date(... dateFields);

要使用新的参数数组而不使用扩展语法,则必须通过部分应用程序间接完成它:

function applyAndNew(constructor, args) {
   function partial () {
      return constructor.apply(this, args);
   };
   if (typeof constructor.prototype === "object") {
      partial.prototype = Object.create(constructor.prototype);
   }
   return partial;
}


function myConstructor () {
   console.log("arguments.length: " + arguments.length);
   console.log(arguments);
   this.prop1="val1";
   this.prop2="val2";
};

var myArguments = ["hi", "how", "are", "you", "mr", null];
var myConstructorWithArguments = applyAndNew(myConstructor, myArguments);

console.log(new myConstructorWithArguments);
// (internal log of myConstructor):           arguments.length: 6
// (internal log of myConstructor):           ["hi", "how", "are", "you", "mr", null]
// (log of "new myConstructorWithArguments"): {prop1: "val1", prop2: "val2"}
三、展开数组字面量

1.更强大的数组字面量

无扩散的语法,使用现有阵列作为它的一个部分创建一个新的数组,数组文本语法不再足够和命令性代码必须使用的组合来代替push,splice,concat等。随着扩展语法此变得更加简洁:

var arr1=["dd","ee"]
var arr2=["aa",...arr1,"bb","cc"]
//["aa","dd","ee","bb","cc"]

就像传播参数列表一样,  ...可以在数组文字中的任何位置使用,并且可以多次使用。

2.复制一个数组
var arr1=["aa",'bb',"cc"]
var arr2=[...arr1]
//["aa","bb","cc"]
3.连接数组

ES6之前我们用Array对象的concat去连接对象如下所示:

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr3 = arr1.concat(arr2);

用扩展语法

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr3 = [...arr1,...arr2];
四、展开对象字面量
ECMAScript提案(第4阶段)的其余/扩展属性将扩展属性添加到对象文字。它将自己提供的对象的枚举属性复制到一个新的对象上。使用较短的语法,可以轻松克隆(不包括原型)或合并对象Object.assign()。
var obj1 = { foo: 'bar', x: 42 };
var obj2 = { foo: 'baz', y: 13 };

var clonedObj = { ...obj1 };
// Object { foo: "bar", x: 42 }

var mergedObj = { ...obj1, ...obj2 };
// Object { foo: "baz", x: 42, y: 13 }

请注意,Object.assign()会触发setters,而展开语法不会

五、只能用于可迭代对象
扩展语法(除扩展属性外)只能应用于可迭代对象:

var obj = {'key1': 'value1'};
var array = [...obj]; // TypeError: obj is not iterable

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值