spread operator

spread operator 当需要多个参数(调用函数时),或多个元素(在数组字面量里)时,可以使用一个简单的表达式来指向他们.

语法

调用函数时:

myFunction(...iterableObj);

在数组字面量里使用时:

[...iterableObj, 4, 5, 6]

在解构赋值中使用:

[a, b, ...iterableObj] = [1, 2, 3, 4, 5];

栗子

取代apply

比如: 当你想把一个数组的值传入函数作为参数,通常会使用 Function.prototype.apply

function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction.apply(null, args);

有了ES6的spread语法,你可以这样写:

function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction(...args);

参数列表里的任意参数你都可以使用spread,并且可以多次使用:

function myFunction(v, w, x, y, z) { }
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);

更强大的数组字面量

比如: 如果你有一个数组,然后想创建一个包含了这个数组的新的数组,那么仅仅使用数组字面量的语法就不够了,你不得不再自己写代码,结合使用 push splice concat 等方法.但有了spread语法,这一切变得很简单:

var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes']; // ["head", "shoulders", "knees", "and", "toes"]

就像在参数列表里使用一样,…可以在数组字面量的任何地方使用,并且可以多次使用.

在 new 对象时使用

比如: 在ES5里,通过 apply 方法来调用 new 关键字是不行的.(在ES5里,apply使用的是[[call]],不是[[Construct]]).但在ES6里,spread语法支持它.

var dateFields = readDateFields(database);
var d = new Date(...dateFields);

取代push

比如: push可以往数组里插入一个数组.在ES5里,通常是这样实现的:

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
// Append all items from arr2 onto arr1
Array.prototype.push.apply(arr1, arr2);

有了ES6的spread,它可以这样写:

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

原文地址