Learning Card
函数参数的默认值
- 可以直接为函数指定参数的默认值
- 参数严格等于
undefined
时默认值生效 - 指定默认值的参数应作为尾参数
- 函数参数的
length
属性不包括默认值参数
rest参数
- 写法:
…变量名
- 用来获取多余的参数
- 是一个真实的数组
- rest参数之后不能有其他参数
length
属性不包括rest参数
- 写法:
name
属性- 返回函数的函数名
箭头函数
function
改为=>
- 当函数不需要参数或者需要多个参数时,使用
()
来包含参数,只有一个参数时可以省略圆括号 - 如果箭头函数的代码块部分多余一条语句,用
{}
括起来,使用return
返回;如果只有一条语句,可以省略{}
和`return this
总是指向定义时的对象
1. 函数参数的默认值
ES6以前,函数参数指定默认值时,只能使用变通的方法。
1 | function log(x, y) { |
这里会先检查y
是否被赋值了,如果没有,就赋值为World
,但是这样写会有一些问题,如果y
的值对应的布尔值是false
,该赋值就不起作用。
ES6允许为函数的参数指定默认值。
1 | function log(x, y = 'World') { |
这里只有当y
的赋值严格等于undefined
的时候,默认值才会有效。如果给y
赋值为空字符串''
,那么y
的值就为空字符串。
参数默认值的位置
参数默认值建议作为函数的尾参数,这样在设置参数值的时候,能更方便地省略设置该参数。如果参数默认值设置在非尾部,那么在省略该参数时,容易将赋值给后面参数的值错误地赋值到默认值上来。
1 | function fn(x = 1, y) { |
函数的length
属性
函数的length
属性是指该函数预期传入的参数个数,如果某个参数被指定了默认值,那么预期传入的参数就不包括这个参数了,因此length
属性会返回没有设定默认值的参数个数,也就是说,指定参数的默认值后,函数的length
属性将失真。
同样地,length
属性也不包括rest参数。
函数参数的作用域
给函数参数指定默认值时,参数会形成一个单独的作用域(可以理解就是函数参数的括号内),等到初始化结束,作用域会消失,这在不设置参数默认值时是不会出现的。
1 | var x = 1; |
上面代码中,y
的默认值是变量x
,调用函数fn
时,参数形成一个单独的作用域,这个作用域内,默认值x
指向第一个参数x
,而不是全局变量x
2. rest 参数
ES6引入了rest参数,写法与arguments
对象类似,形式是…变量名
,用来获取函数的多余参数。
rest参数和arguments
对象的区别在于,arguments
对象时一个类似数组的对象,如果需要使用对象的方法,就必须使用Array.prototype.slice.call(arguments)
来转换成数组使用,而rest参数是一个真正的数组
1 | const sortNumbers = (...numbers) => numbers.sort(); |
注意点:
- rest参数之后不能有其他参数
- 函数的
length
属性不包括rest参数
3. name
属性
函数的name
属性返回函数的函数名
1 | function foo() {} |
4. 箭头函数
箭头函数的写法:
- 省略了关键字
function
- 使用
=>
定义函数 - 当函数不需要参数或者需要多个参数时,使用
()
来包含参数,只有一个参数时可以省略圆括号 - 如果箭头函数的代码块部分多余一条语句,用
{}
括起来,使用return
返回;如果只有一条语句,可以省略{}
和return
1 | let result = values.sort((a, b) => a-b); |
注意点:
- 箭头函数的
this
对象是固定的,永远指向定义时所在的对象,而不是使用时所在的对象 - 不可以作为构造函数,即不可以使用
new
命令 - 可以使用rest参数,但是不可以使用
arguments
对象 - 不能作为generator函数
ES6学习笔记的内容主要基于阮一峰老师的《ECMAScript 6入门》,原文请见链接