ES 6 系列之函数的扩展
函数参数默认值
基本用法
我们来介绍一下函数的默认值,在 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方式。
我们先来看看 ES6 之前怎么给函数参数添加默认值
1 | function add(x, y) { |
我们做的是检查 y
的值有没有传入,如果没有则会默认被赋值为 1
。这种方式是有缺点的,如果传入的值为布尔值 false
,那么传入的值会变得无效。空字符串也是会有布尔值 false
一样的结果。
那么现在我们来看看 ES6 允许设置默认值的写法吧
1 | function add(x = 1, y = 2) { |
从上面的代码就可以看到,一眼就可以判断出参数是否可省略,且写法比 ES5
简洁许多
注意:
- 函数的参数变量是默认声明的,所以不能使用 let 或者 const 再次声明。
- 参数默认值的位置,必须是在函数的尾部,如果不是在尾部,否则是没法省略的。
解构赋值与默认值结合使用
1 | function add([x, y] = [1, 2]) { |
来我们还是先用 add
函数来举例,上面就是用的数组的解构赋值,可以个传入的数组进行解构赋值,默认解构赋值。
函数的 length
很奇怪吧,函数居然能有 length
,来我们在这里简单提一下函数的 length
是什么。
1 | console.log(function (x) {}.length); // 1 |
没错,就是这样。它的 length
就是函数必须传入的参数,也就是函数的所有参数减去制定了默认值的参数个数。 如果设置了默认值的参数不是尾参数,那么 length
属性也不再计入后面的参数了。
作用域
rest 参数
ES6 中引入来 rest
参数(形式为 ...变量名
),用于获取函数的多余参数,替代 arguments
对象。
我们还是那 add
函数来举例吧。
1 | function add(...values) { |
这里就可以看出来,rest
参数是做什么用的,使用它之后,参数可以无限传入,不限制定量。
函数的 length
不包括 rest
参数。
箭头函数
基本使用
我们来看看 ES6 中增加的箭头函数( =>
),来我们还是用 add
函数来举例子,
1 | function add(a, b) { |
来看看更简单的写法
1 | function multiply(n) { |
有时候 return
可以省略。
当然,箭头函数可以嵌套使用,会大大增加代码量
1 | function add(x) { |
上面是普通的写法,然后我们来看一下箭头函数的写法
1 | const add = (x) => (y) => (z) => x + y + z; |
对比一下,应该就知道啦,两种的写法简便程度差别真的很大。
注意点
在这里,稍微提一下箭头函数的相关注意点:
- 箭头函数没有自己的
this
对象 - 不可以当作构造函数,即不可使用
new
命令 - 不可以使用
arguments
对象,不存在该对象,但是可以使用rest
参数代替 - 不可以使用
yield
命令,因此箭头函数不能使用Generator
函数
在这里不特点讲述,如果想要具体了解,可以看一下我的另一篇文章Javasctip - this 指向,文章后续补齐。