2010-09-08 101 views
11

所以我一直這樣做,只要我記得,但我很好奇,如果這真的是我應該做的。你寫一個函數接受一個參數,所以你預期它有一個值,但如果沒有,你有一個很好的理由來默認它,說零。我現在做的是寫一個輔助函數:函數參數的默認值?

function foo() { return foo(0); }; 
function foo(bar) { ... }; 

我剛剛跑過這樣的情況:我這樣做,我看着它奇怪幾秒鐘理解它背後我的邏輯之前。我來自php它瑣碎:

function foo(bar=0) { ... } 

是否有一個JavaScript的替代品,我不知道?

+0

http://stackoverflow.com/questions/148901/is-there的重複-a-better-way-do-do-optional-function-parameters-in-javascript – BGerrissen 2010-09-08 21:40:36

回答

16

JavaScript中不能有重載函數。相反,使用基於對象的初始化,或檢查值,並分配一個默認值,如果沒有提供。

在您的示例中,第二個函數foo(bar)將替換第一個函數。

這是一個使用對象初始化的函數。

function foo(config) { 
    extend(this, config); 
} 

其中extend是合併與當前對象的配置對象的功能。它類似於jQuery中的$.extend方法或MooTools的$extend方法。

調用函數,並將它傳遞名爲鍵值對

foo({ bar: 0 }); 

另一種方法來初始化是看所提供的值,並指定一個默認的,如果沒有給出值

function foo(bar) { 
    bar = bar || 0; 
} 

只要酒吧不是一個虛假的價值,這工作。因此foo(false)foo("")仍會初始化bar0。對於這種情況,請進行明確的檢查。

function foo(bar) { 
    bar = (typeof bar == 'undefined' ? 0 : bar); 
} 
5

在JavaScript中,如果用戶沒有在傳遞給它的參數將是不確定的。您可以使用||運算符設置參數的值,如果它未定義:

function foo(bar) { 
    bar = bar || 0; 
    ... 
} 
+5

你最好檢查一下'bar === undefined'而不是做這個簡單的測試。 – jrharshath 2010-09-08 21:43:14

+0

@jrharshath我只是找出'variable === undefined'是錯誤的,因爲undefined實際上是一個未定義的變量,而不是一個保留字。所以,如果你以前分配'undefined = true;'然後測試'alert(x === undefined)//返回false'所以你應該使用typeof變量=== undefined'來檢查。 – 2012-05-15 20:31:58

+1

這個答案是錯誤的,因爲你不能傳遞0也不false或者null。例如:如果bar默認爲true,就像這個'bar = bar ||真正的'你不能通過虛假,酒吧將永遠是真實的。 – 2012-05-15 20:39:39

1

我知道最簡單的方法是測試一個值,然後在沒有找到值的情況下將其設置爲默認值。我還沒有遇到過所有的班輪,這是我得到的最好的。

如果期待字符串值使用這個。默認值將觸發這些值:[undefined,null,「」]

function foo(str) { 
    str = !!str ? str : 'bar'; 
    ... 
} 

如果期待一個數字或布爾值。這允許0和false作爲值。默認情況下會觸發[未定義,爲null,{},功能]

非常方便的值的參數,只有當你正在尋找測試對象接受像數字,布爾和字符串

function foo(val) { 
    val= !!val == val || val*1 ? val : 10; 
    ... 
} 

原始值如{},有這樣做的文檔,但並不那麼簡單。

0

希望這回答了一個更清楚一點的人 - 我最終使用的醇」檢查未定義if(typeof functionparameter !== 'undefined')按:

$.fn.extend({ 
    doThing: function(stringparameter = 'FooBar!', functionparameter){ 
     console.log('Here is your string '+stringparameter); 
     // Run it if it's been passed through: 
     if(typeof functionparameter !== 'undefined') functionparameter(); 
});