2012-10-03 33 views
20

這是檢查功能中缺少參數的正確方法嗎?這會在所有瀏覽器中工作嗎?如何IE瀏覽器?檢查功能中是否缺少參數

function getName(name){ 
    name = name != null ? name : "default"; 
    return name; 
} 
+0

一個人如何在這種情況下界定「正確」?爲了給你最好的答案,我們需要知道參數應該被覆蓋的上下文。 – zzzzBov

+0

最近,我問是否有可能在JavaScript函數中列出每個缺失參數的名稱,並且我在這裏找到了許多有趣的解決方案:http://stackoverflow.com/questions/17387222/ –

回答

13

你可以這樣做:

name = name || 'default'; 

說,如果name未定義或falsy(null0""false{}[]),將其設置爲"default"。我們會抱怨它,但它的作用至少和IE7一樣。它根本不是無效的代碼,或者依賴一些無證的行爲。

+5

這當然會讓謬誤論證看起來「缺失」。根據你在做什麼,這可能意味着很多誤報。 – NullUserException

+0

是的。但是,如果名稱應該是某種東西或「默認」,這保證了它。如果'name'可以是'false','''''或其他空的東西,那麼不會,你不能使用這個方法,但是爲什麼設置一個默認值,如果你不打算用它來捕獲空的或不正確的情況。 – tkone

+3

有些情況下,如果變量未定義,而允許0或空字符串爲有效值,則您希望具有默認值。你在做什麼會不分青紅皁白地屠殺所有的謬誤價值。 – NullUserException

6

正確的檢查方法是

if (typeof name === "undefined") { 
    // ... 
} 

當然致電市民中仍然可以通過調用getName(undefined),當提供一個參數,但該檢查將其標記爲仍然沒有提供的「傻瓜」你。但這確實是一種病態情況。

+0

如果你做'name = name || 「default」方法雖然傳入'undefined'仍然可以像你期望的那樣工作。 – tkone

+1

@tkone Jon在談論可能的誤報。 – NullUserException

+0

@NullUserException不是當我離開我的評論。從那時起,答案已被編輯。 – tkone

0

是的,這將在所有的瀏覽器工作,但如果你想看看它是否被定義您可以使用:

function getName(name){ 
    name = typeof(name) !== "undefined" ? name : "default"; 
    return name; 
} 
46

的方式來檢查參數取決於你傳遞到什麼類型的信息函數,以及你希望你的函數如何處理邊界情況。

在大多數情況下,你可以簡單地使用:

function foo(bar) { 
    bar = bar || ...default value here...; 
} 

但是,如果你的代碼看起來像這樣它可能是一個問題:

function foo(bar) { 
    bar = bar || 5; 
    alert(bar); 
} 
foo(0); //alerts 5, probably not what you wanted 

因此,相反,你通常可以檢查對undefined

function foo(bar) { 
    if (bar == undefined) { 
     bar = ...default value... 
    } 
} 

...然而使用鬆散檢查允許兩個nullundefined被覆蓋(null == undefined):

function foo(bar) { 
    if (bar == undefined) { 
     bar = 0; 
    } 
    alert(bar); 
} 
foo(); //alerts 0 
foo(null); //alerts 0 

所以取而代之,一個嚴格相等比較(===)通常是優選的(null !== undefined):

function foo(bar) { 
    //if you're worried that undefined may be overwritten for any horrible reason 
    //use `typeof bar === 'undefined'` instead 
    if (bar === undefined) { 
     bar = ...default value... 
    } 
} 

然而,如果您需要知道undefined是否作爲參數通過,則這可能會導致問題:

function foo(bar) { 
    if (bar === undefined) { 
     bar = 0; 
    } 
    alert(bar); 
} 
foo(undefined); //alerts 0, which may or may not be desired 

如果你想絕對肯定,你不及格了這是提供參數,你可以檢查傳遞給函數的參數個數:

function foo(bar) { 
    if (arguments.length < 1) { 
     bar = ...default value...; 
    } 
} 

,這意味着你可以順利通過undefined爲爭論同時也可以選擇使用不同的默認:

function foo(bar) { 
    if (arguments.length < 1) { 
     bar = 0; 
    } 
    alert(bar); 
} 
foo(undefined); //alerts undefined 
foo(); //alerts 0 

如果有多個參數,您可能需要使用多個默認值。我最近發現的下通在switch語句中使用的情況下,雖然the utility is questionable

function foo(bar, baz, fizz, buzz) { 
    switch (arguments.length) { 
    case 0: 
     bar = 1; 
     //continue; might as well point out that implicit fall-through is desired 
    case 1: 
     baz = 2; 
     //continue; 
    case 2: 
     fizz = 3; 
     //continue; 
    case 3: 
     buzz = 4; 
     //continue; 
    } 
    ...code... 
} 
+4

非常全面,也是一系列問題的更好答案。 – tkone

+3

謝謝你這樣徹底的回答。 – 3coins