es6 - 函數的擴展

es6 - 函數的擴展

上一篇,咱們介紹了es6箭頭函數的內容 - es6 - 箭頭函數es6

事實上,箭頭函數只是函數擴展中最有意思的那部分,除此之外,es6函數還增長了一些其餘的特性,下面將對它們進行一一介紹。segmentfault

語法

es6函數參數的默認值

在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時,纔會使用參數的默認值。性能

es6剩餘參數

剩餘參數由三個點...和一個具名參數指定,好比優化

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函數還引入了new.target元屬性。用來判斷函數的調用方式,是做爲普通函數調用,仍是使用new做爲構造函數調用。

最佳實踐

es6新引入的默認參數和剩餘參數特性都很是好用。推薦使用默認參數代替原來arg1 = arg1 || 默認值 的書寫方式, 使用剩餘參數代替arguments的能力來操做參數。

相關文章
相關標籤/搜索