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);