上一篇,咱們介紹了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的能力來操做參數。