学习ES6:函数扩展

es6中函数扩展

函数默认值

ES6开始可以对函数参数列表添加默认值。

基本用法

1
2
3
function func(a = 1, b = 2) {
//TODO...
}

设置了默认值的参数应放在未赋默认值的参数后面(尾参数)。

结构赋值

与结构赋值相结合。

当函数参数中含有一个对象参数时,可设置双重默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function func1({x = 0, y = 1} = {}) {
console.log(x, y);
}

function func2({x = 0, y = 1}) {
console.log(x, y);
}

function func3({x, y} = {x:1, y:2}) {
console.log(x, y);
}

func1({x:10, y:20}); //10 20
func2({x:10, y:20}); //10 20
func3({x:10, y:20}); //10 20

func1(); //0 1
func2(); // TypeError
func3(); //1 2

func1({}); //0 1
func2({}); //0 1
func3({}); //undefined undefined

func1({x:10}); //10 1
func2({x:10}); //10 1
func3({x:10}); //10 undefined

func1({y:10}); //0 10
func2({y:10}); //0 10
func3({y:10}); //undefined 10

length属性

函数的length属性返回函数参数未指定默认值的参数个数。

length属性忽略函数参数中的扩展运算符。

作用域

若参数默认值是一个变量,则该变量先在其左边的函数参数列表中寻找该变量值,未找到则在函数所在的作用域找,还找不到则报错。

rest参数

  • 形式 “…变量名”。
  • rest参数为一个数组,函数多余的参数都会存在这个参数中。
  • rest参数后不能再有其它参数。
  • rest参数为一个数组,所有数组特有的方法都可以用于这个变量。

rest参数

rest参数运用到了扩展运算符,形式为 ...
该运算符将一个数组变为参数序列。

...相关应用

数组合并

1
2
3
4
let arr = [1, 2, 3];
let newArr = [3, 4, 5, ...arr];

console.log(newArr); // [ 3, 4, 5, 1, 2, 3 ]

数组转参数序列

1
2
3
4
5
let numbers = [1, 3, 6, 4, 2];
//ES5
Math.min.appy(null, numbers);
//ES6
Math.min(...numbers);

结构赋值

1
[a, ...rest] = [1, 2, 3, 4, 5];

扩展运算符的参数只能放最后

箭头函数

  1. 箭头函数体内的this对象会在定义时捕获上下文的this值,而不是使用时调用其的对象。
  2. 不可用作构造函数。
  3. 不可以使用arguments对象,该对象在箭头函数内不存在,可以用rest。
  4. 箭头函数不能用作generator。

下面内容摘录MDN-Arrow functions

  • 一个箭头函数表达式的语法比一个函数表达式更短,并且不绑定自己的 this,arguments,super 或 new.target。
  • 返回一个对象时,函数体外要加圆括号
  • 箭头函数表达式对非方法函数是最合适的
  • 箭头函数在参数和箭头之间不能换行

尾调用

尾调用即在某个函数的最后一步是调用另一个函数。调用后不能再出现如赋值/运算等操作。

尾调用优化

通过尾调用优化,可以优化函数的调用栈,但是前提时尾调用的函数不能使用到外层函数的内部变量。

尾调用优化需要开启严格模式

尾递归

尾调用的时该函数本身即时尾递归。

由于递归非常消耗内存,有可能发生栈溢出,如果使用尾递归,则大大减少了内存占用。

不过递归函数改写成尾递归一般会造成函数较难理解,参数意义不明的问题。

解决方法:

一. 在尾递归函数之外再提供一个正常形式的函数。
二. 将尾递归函数柯里化

尾逗号

  • 所谓尾逗号,就是允许函数等结构参数末尾添加一个逗号。
  • 该特性主要时为版本管理服务。
  • 函数参数不能仅有尾逗号。
  • 使用了扩展运算符后不能使用尾逗号。
  • JSON还不支持尾逗号。
  • 数组/函数参数/对象支持尾逗号。