【探祕ES6】系列專欄(五):剩餘參數和默認參數

S6做爲新一代JavaScript標準,正式與廣大前端開發者見面。爲了讓你們對ES6的諸多新特性有更深刻的瞭解,Mozilla Web開發者博客推出了《ES6 In Depth》系列文章。CSDN已獲受權,將持續對該系列進行翻譯,組織成【探祕ES6】系列專欄,供你們學習借鑑。本文爲該系列的第五篇。
前端

本文講述的是有關ES6剩餘參數(Rest parameters)和默認參數(Defaults parameters)的使用。es6

剩餘參數(Rest parameters)數組

當須要建立一個可變函數API時,該函數須要實現任意數目參數的輸入。例如,String.prototype.concat方法可接受任意數目的字符串參數輸入。而在ES6中,可利用剩餘參數來轉變實現思路。函數

如下將結合實例說明。containsAll是一個可變函數,用於檢測字符串是否包含成分子串。例如,containsAll("banana", "b", "nan")返回true,containsAll("banana", "c", "nan")則返回false。學習

採用傳統寫法的代碼以下:spa

function containsAll(haystack) {  
  for (var i = 1; i < arguments.length; i++) {  
    var needle = arguments[i];  
    if (haystack.indexOf(needle) === -1) {  
      return false;  
    }  
  }  
  return true;  
}
該方法的核心是利用了 參數對象 ,以數組的方式向函數傳入參數。它徹底知足需求,但可讀性差。其函數參數僅是惟一的haystack,所以很難一眼就看出到底包含了哪些參數。此外,在進行遞歸運算時,須要注意初始位置的索引號是1而不是0,由於arguments[0]對應的是haystack參數。最後倘若須要在haystack的前或後添加別的參數,那麼就不得不對循環進行更新。若是換用剩餘參數,這些問題皆可一一迎刃而解。

使用剩餘參數的代碼以下:.net

function containsAll(haystack, ...needles) {  
  for (var needle of needles) {  
    if (haystack.indexOf(needle) === -1) {  
      return false;  
    }  
  }  
  return true;  
}
該方法實現了與傳統寫法同樣的功能,區別是使用了特殊的語法...needles。那麼對於containsAll("banana", "b", "nan"),其運算過程是怎麼樣的呢?首先haystack被第一個參數banana填充;位於needles前的符號...代表needles爲剩餘參數;之後的其它參數會被放入一個數組而後再分配給變量needles,本例中爲["b", "nan"];以後的判斷過程按常規執行。(注:這裏使用了for-of 循環語法)

要提醒一點,只有位於最末的參數可被標記爲剩餘參數。位於剩餘參數以前的參數與普通參數的處理方式是同樣的。全部的額外參數都會被放入一個數組而後再分配給剩餘參數。若是沒有額外參數,剩餘參數則爲一個空數組;剩餘參數不能被賦值爲undefined。prototype

默認參數(Default parameters)翻譯

不少時候,函數對傳入的參數不必定全都進行處理,同時默認參數亦能夠替代傳入參數來進行使用。JavaScript一直以來在默認參數的處理上都顯得比較笨拙;無值參數會被看做undefined。ES6裏引入了特殊的默認參數處理方式。rest

請看下面的例子。

function animalSentence(animals2="tigers", animals3="bears") {  
    return `Lions and ${animals2} and ${animals3}! Oh my!`;  
}
對上述函數中每一個參數來講,=以後的賦值表達式做用是爲參數進行默認取值。所以,  animalSentence() 返回「Lions and tigers and bears! Oh my!」,animalSentence("elephants") 返回「Lions and elephants and bears! Oh my!」,animalSentence("elephants", "whales") 返回「Lions and elephants and whales! Oh my!」。

使用默認參數時,有幾點須要留意。

  • 不一樣於Python,默認值表達式在函數調用的時候進行求值。也就是說,默認表達式能夠使用已定義的參數值。例如把上述動物例子的函數改成較特別的方式:

function animalSentenceFancy(animals2="tigers",  
    animals3=(animals2 == "bears") ? "sealions" : "bears")  
{  
  return `Lions and ${animals2} and ${animals3}! Oh my!`;  
}
  • 取值undefined的做用等因而沒有傳入任何東西。所以,animalSentence(undefined, "unicorns") 返回的是 "Lions and tigers and unicorns! Oh my!"

  • 沒有顯式定義的默認參數等同於undefined,所以:

function myFunc(a=42, b) {...}

等同於

function myFunc(a=42, b=undefined) {...}


小結

ES6對剩餘參數和默認參數使得JS函數的聲明更具可讀性和表達性,不妨動手試試。(譯者:伍昆 責編:陳秋歌)

原文連接:ES6 In Depth: Rest parameters and defaults

本譯文遵循Creative Commons Attribution Share-Alike License v3.0

相關文章
相關標籤/搜索