1、函数的默认值
从ES6开始,允许为函数参数设置默认值,即直接写在参数定义后面。
function log(x, y = 'ES6') {
console.log(x, y);
}
log('Hello') // Hello ES6
log('Hello', 'Word') // Hello China
log('Hello', ' ') // Hello
参数变量是默认声明的,因此不能再使用let和const命令再次声明,否则会报错。
function foo(a=1){
let a=2; //error
const a=4; //error
}
2、与解构赋值结合使用
参数默认值可以与解构赋值的默认值结合起来使用。
function foo({x, y = 5}) {
console.log(x, y);
}
foo({}) // undefined, 5
foo({x: 1}) // 1, 5
foo({x: 1, y: 2}) // 1, 2
foo() // TypeError: Cannot read property 'x' of undefined
只有当函数foo对象时,变量x和y才会通过解构赋值而生成,如果函数foo调用的参数不是对象,变量x,y不会生成,就会报错。如果参数对象没有y值,y的默认值会生效。
3、length属性
指定默认值以后,函数的length属性返回的是没有指定默认值参数的个数,因为Length属性的含义就是函数预期传入参数的个数,当某个参数指定了默认值以后,预期的传入参数就不再包括已经指定的默认参数。
(function (a) {}).length // 1
(function (a = 0) {}).length // 0
(function (a, b, c = 1,d=2) {}).length // 2
rest参数也是一样,不会计入length属性
(function(...args) {}).length // 0
另外,如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。
(function (a = 0, b, c,d) {}).length // 0
(function (a, b = 1, c,d) {}).length // 1
4、name属性
函数的name属性,返回该函数的函数名。
function foo(){}
foo.name // "foo"
这个属性早就被浏览器广泛支持,但是直到ES6,才将其写入了标准。
需要注意的是ES6对这个属性的行为做出了一些修改。如果将一个匿名函数赋值给一个变量。ES5的name属性,会返回空字符串,而ES6的name属性会返回实际的函数名。
var func= function () {};
// ES5
func.name // ""
// ES6
func.name // "func"
如果将一个具名函数赋值给一个常量,则ES5和ES6的name属性都返回这个具名函数原本的名字。
const bar = function baz() {};
// ES5
bar.name // "baz"
// ES6
bar.name // "baz"