函数参数的默认值
function log(x, y = 'World') {console.log(x, y);
}log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hellofunction Point(x = 0, y = 0) {this.x = x;this.y = y;
}var p = new Point();
p // { x: 0, y: 0 }
函数length 的属性
指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。
(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2
如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了
(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1
作用域
var x = 1;function f(x, y = x) {console.log(y);
}f(2) // 2
上面代码中,参数y的默认值等于x。调用时,由于函数作用域内部的变量x已经生成,所以y等于参数x,而不是全局变量x。
let x = 1;function f(y = x) {let x = 2;console.log(y);
}f() // 1
上面代码中,函数调用时,y的默认值变量x尚未在函数内部生成,所以x指向全局变量。
应用
利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。
function throwIfMissing() {throw new Error('Missing parameter');
}function foo(mustBeProvided = throwIfMissing()) {return mustBeProvided;
}foo();
rest参数
function add(...values) {let sum = 0;for (var val of values) {sum += val;}return sum;
}add(2, 5, 3) // 10
// arguments变量的写法
function sortNumbers() {return Array.prototype.slice.call(arguments).sort();
}// rest参数的写法
const sortNumbers = (...numbers) => numbers.sort();
function push(array, ...items) {items.forEach(function(item) {array.push(item);console.log(item);});
}var a = [];
push(a, 1, 2, 3)
函数的length属性,不包括rest参数。
(function(a) {}).length // 1
(function(...a) {}).length // 0
(function(a, ...b) {}).length // 1
扩展运算符
function push(array, ...items) {array.push(...items);
}function add(x, y) {return x + y;
}var numbers = [4, 38];
add(...numbers) // 42
替代数组的apply方法
// ES5的写法
function f(x, y, z) {// ...
}
var args = [0, 1, 2];
f.apply(null, args);// ES6的写法
function f(x, y, z) {// ...
}
var args = [0, 1, 2];
f(...args); // ES5的写法
Math.max.apply(null, [14, 3, 77])// ES6的写法
Math.max(...[14, 3, 77])// 等同于
Math.max(14, 3, 77); // ES5的写法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);// ES6的写法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
arr1.push(...arr2);
合并数组
// ES5
[1, 2].concat(more)
// ES6
[1, 2, ...more]var arr1 = ['a', 'b'];
var arr2 = ['c'];
var arr3 = ['d', 'e'];// ES5的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]// ES6的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
实现了Iterator接口的对象
var nodeList = document.querySelectorAll('div');
var array = [...nodeList];
箭头函数
var f = v => v;
等同于
var f = function(v) {return v;
};