spread operator(...)
1 可以展开数组形参
例子:
let myArr = [5,10,25];Math.max(myArr); //NaN,因为Math.max(); 不支持传入数组Math.max(...myArr); //25,...myArr,将数组展开为多个形参
2 构造函数使用简便
new Date([2016,7,25]); //Mon Jul 25 2016 00:00:00 GMT+0800 (CST)
Rest Parameters
注意:rest parameter 必须是最后一个参数,而且只能有一个rest paramter
1 将参数转变为数组Array
例子:
function myFunction(...options) { return options;}myFunction('a', 'b', 'c'); //["a", "b", "c"]
function checkSubstrings(string, ...keys) { for (var key of keys) { if (string.indexOf(key) === -1) { return false; } } return true;}checkSubstrings('this is a string', 'is', 'this'); // true
Default parameters
在ECMAScript 5中,默认的参数值一般这么构造,使用‘||’
function foo(param1, param2) { param1 = param1 || 10; param2 = param2 || 10; console.log(param1, param2);}foo(5, 5); // 5 5foo(5); // 5 10foo(); // 10 10
在ECMAScript 6中,可以这么来用
function foo(a = 10, b = 10) { console.log(a, b);}foo(5); // 5 10foo(0, null); // 0 null
Destructing
从Array或Object形参中抽出属性,赋值给变量
ECMAScript 5中
function initiateTransfer(options) { var protocol = options.protocol, port = options.port, delay = options.delay, retries = options.retries, timeout = options.timeout, log = options.log; // code to initiate transfer}options = { protocol: 'http', port: 800, delay: 150, retries: 10, timeout: 500, log: true};initiateTransfer(options);
在ECMAScript 6中,可以省去一大段代码
function initiateTransfer({protocol, port, delay, retries, timeout, log}) { // code to initiate transfer};var options = { protocol: 'http', port: 800, delay: 150, retries: 10, timeout: 500, log: true}initiateTransfer(options);
但要注意,实参不能为空,否则会报错
function initiateTransfer({protocol, port, delay, retries, timeout, log}) { // code to initiate transfer}initiateTransfer(); // TypeError: Cannot match against 'undefined' or 'null'
要解决这个问题,需要给形参赋初始值
function initiateTransfer({protocol, port, delay, retries, timeout, log} = {}) { // code to initiate transfer}initiateTransfer(); // no error
或者,给每个抽取的参数赋值
function initiateTransfer({ protocol = 'http', port = 800, delay = 150, retries = 10, timeout = 500, log = true}) { // code to initiate transfer}
Mandatory Arguments
要求形参非空
function throwError() { throw new Error('Missing parameter');}function foo(param1 = throwError(), param2 = throwError()) { // do something}foo(10, 20); // okfoo(10); // Error: missing parameter
Arguments Object
类数组排序
function sort() { var a = Array.from(arguments); return a.sort();}sort(40, 20, 50, 30); // [20, 30, 40, 50]