变量默认值
- 不能用let或const再次声明
- 参数默认值是惰性求值的
- 参数默认值可以与解构赋值的默认值,结合起来使用
- 指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。
- 如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。
(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1
es5中:
function a(x,y){
y=y||'aaa'
console.log(y)
}
es6:
function a(x,y='aaa'){
console.log(y)
}
f(, 1) // 报错
f(undefined, 1) // [1, 1]
//如果传入undefined,将触发该参数等于默认值,null则没有这个效果。
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。
let x = 1;
function f(y = x) {
let x = 2;
console.log(y);
}
f() // 1
var x = 1;
function foo(x = x) {
// ...
}
foo() // ReferenceError: x is not defined
var x = 1;
function foo(x, y = function() { x = 2; }) {
var x = 3;
y();
console.log(x);
}
foo() // 3
x // 1
rest参数
(function(a) {}).length // 1
(function(...a) {}).length // 0
(function(a, ...b) {}).length // 1
扩展运算符...
如同rest的逆运算
// 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);