默認參數值

如果形參沒有被傳入對應的實參或者傳入了 undefined ,則該形參會被賦一個默認值。

描述

在 JavaScript 里,函數參數默認是 undefined 。然而,在某些情況下設置一個不同的默認值可能是有需要的。默認參數可以幫助解決這個問題。
過去,一般的設置默認參數方法是在函數體測試參數是否為 undefined,如果是的話就設置為默認的值。例如:

function multiply(a, b) {
  b = typeof b !== 'undefined' ?  b : 1;

  return a*b;
}

multiply(5); // 5

有了默認參數,我們不需要再在函數體內做什么不必要的檢查。現在你可以在函數頭將b的默認值設置為1:

function multiply(a, b = 1) {
  return a*b;
}

multiply(5); // 5

注:即使顯式地傳入了undefined,參數的值也會去默認值。

調用時解析

在函數被調用時,參數默認值會被解析,所以不像 Python 中的例子,每次函數調用時都會創建一個新的參數對象。

function append(value, array = []) {
  array.push(value);
  return array;
}

append(1); //[1]
append(2); //[2], not [1, 2]

這個規則對于函數和變量也是適用的。

function callSomething(thing = something()) { return thing }

function something(){
  return "sth";
}

callSomething();  //sth
前置參數對于后面的默認參數是可見的

已經被聲明的參數對于后面的默認參數是可見的。

function singularAutoPlural(singular, plural = singular+"s", 
                            rallyingCry = plural + " ATTACK!!!") {
  return [singular, plural, rallyingCry ]; 
}

//["Gecko","Geckos", "Geckos ATTACK!!!"]
singularAutoPlural("Gecko");

//["Fox","Foxes", "Foxes ATTACK!!!"]
singularAutoPlural("Fox","Foxes");

//["Deer", "Deer", "Deer ... change."]
singularAutoPlural("Deer", "Deer", "Deer peaceably and respectfully
   petition the government for positive change.")

以下這個例子近似模擬了一些比較簡明的情況,并說明了特殊情況是怎么被處理的。

function go() {
  return ":P"
}

function withDefaults(a, b = 5, c = b, d = go(), e = this, 
                      f = arguments, g = this.value) {
  return [a,b,c,d,e,f,g];
}
function withoutDefaults(a, b, c, d, e, f, g){
  switch(arguments.length){
    case 0:
      a
    case 1:
      b = 5
    case 2:
      c = b
    case 3:
      d = go();
    case 4:
      e = this
    case 5:
      f = arguments
    case 6:
      g = this.value;
    default:
  }
  return [a,b,c,d,e,f,g];
}

withDefaults.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]

withoutDefaults.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]
函數嵌套定義

在函數體內的函數聲明不能引用內部的默認參數,并會出現 ReferenceError 錯誤。默認參數總是會被首先執行,而在函數體內部的函數聲明會在之后生效。
函數呃逆定義的閉包對于默認參數是不能引用的,如果引用會報錯(“Reference Error”)。默認參數總是被最先解析,函數內部的聲明會在這之后被解析。

// Doesn't work! Throws ReferenceError.
function f(a = go()) {
  function go(){return ":P"}
}
位于默認參數之后非默認參數
function f(x=1, y) { 
  return [x, y]; 
}

f(); // [1, undefined]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容