上一篇,咱们介绍了es6箭头函数的内容 - es6 - 箭头函数。es6
事实上,箭头函数只是函数扩展中最有意思的那部分,除此之外,es6函数还增长了一些其余的特性,下面将对它们进行一一介绍。segmentfault
在es6以前,咱们若是想要设置函数参数的默认值,须要这样写代码:数组
function makeRequest(url, timeout, callback){ timeout = timeout || 2000; callback = callback || function(){}; //... }
或者更加严谨的写法:app
timeout = (typeof timeout !== 'undefined') ? timeout : 2000; callback = (typeof callback !== 'undefined') ? callback : function(){};
es6增长了函数参数默认值的特性,能够直接在参数里设置函数
function makeRequest(url, timeout = 2000, callback = function(){}){ //... }
注意:只有在没有传入相应的参数或是传入undefined时,才会使用参数的默认值。性能
剩余参数由三个点...
和一个具名参数指定,好比优化
function pick(object, ...keys){ console.log(keys); }
在这个函数内部,剩余参数keys是由传入的第二个参数及之后的参数组成的数组。若是只传入0个或者1个参数,keys为空数组。url
扩展运算符有点像是剩余参数的副作用。 咱们使用一个场景来讲明扩展运算符...
该怎么使用:code
function getMax(num1, num2){ let result = arguments[0]; for(var i=0; i<arguments.length; i++){ if(arguments[i] > result){ result = arguments[i]; } } return result; }
上面这个函数大概实现了返回参数中最大值的功能。咱们能够这样调用它,getMax(num1, num2, num3, ...)
。递归
但是若是我如今想把一个很大的数组 arr 做为参数传入函数中呢?
或许可使用apply方法:getMax.apply(null, arr);
但是这样实现总感受不大对劲,使用...可以使得代码意图更加清晰: getMax(...arr)
。
...
运算符可以将arr分割为单独的参数传入函数,它甚至还能够和其余参数一块儿使用:
好比: getMax(num1, ...arr, num2)
。代码这样看起来好多了。
es6给全部的函数都添加了name属性,用来根据名称识别函数。匿名函数的name属性的值为空字符串。在实践中,该属性使用不多,再也不赘述。
记得在js语言精粹中介绍递归部分时,做者说,js没有尾调用优化,因此递归可能由于堆栈溢出而运行失败。
在es6中,js提供了尾调用优化,什么是尾调用优化?能够参考下面代码:
function doSomething(){ return doSomethingElse(); }
上面的doSomethingElse函数的调用语句是doSomething的最后一条语句,并做为doSomething返回值返回。上面的函数就实现了尾调用优化。
尾调用优化可以提升函数的性能。它最适合的使用场景是在递归中使用。
在平时的开发中,除非使用递归或者是尽力优化函数的性能,不然无需考虑太多尾递归优化。
es6新引入的默认参数和剩余参数特性都很是好用。推荐使用默认参数代替原来arg1 = arg1 || 默认值
的书写方式, 使用剩余参数代替arguments的能力来操做参数。