1、函数形参的默认值
在ES5中函数定义了参数,如果要设置默认值,则需要在函数内进行判断处理,例如:
而在ES6中,可以在函数形参中直接定义默认值,例如:
2、默认参数影响arguments
在ES5,非严格模式下,修改参数时,arguments也会跟着变,例如:
在严格模式下,则不同,修改参数,arguments的值也不会变,例如:
所以在ES6下面和ES5的严格模式下,arguments的行为是一样的,修改参数值,不会影响arguments的值。
3、处理无命名参数
在函数的命名参数前添加三个点(...)就表明这是一个不定参数,该参数为一个数组,包含着自它之后传入的所有参数,通过这个数组名即可逐一访问里面的参数。例如:
需要注意的是:
(1)每个函数最多只能声明一个不定参数,而且一定要放在所有参数的末尾。
(2)不定参数不能用于对象字面量setter之中。
4、展开运算符
展开运算符其实跟不定参数基本相似。Math.max()方法返回两个参数中大的一个,那么怎么返回一个数组中最大的呢。在ES6中,就可以用下面代码:
5、箭头函数
箭头函数和传统函数有以下几点不同:
(1)没有this、super、arguments和new.target绑定。
(2)不能通过new关键字调用。
(3)没有原型
(4)不可以改变this的绑定。
(5)不支持arguments对象。
(6)不支持重复的命名参数。
箭头函数一般的写法如下:
创建立即执行函数表达式,例如:
6、尾调用优化
尾调用指的是函数作为另一个函数的最后一条语句被调用。
在ES5中,尾调用函数会创建一个新的栈帧,推入调用栈,所以在循环调用的时候,相互不能释放,就可能导致调用栈越来越大。
在ES6中,缩减了严格模式下的尾调用栈的大小,满足以下条件,尾调用不再创建新的栈帧,而是清除并重用当前栈帧:
(1)尾调用不访问当前栈帧的变量
(2)在函数内部,尾调用是最后一条语句
(3)尾调用的结果作为函数值返回
例如:
下面的情况不会进行优化:
所以一般尾调用优化用的最多的场景就是递归函数。递归的计算很大,那么优化就会很大。