這是檢查功能中缺少參數的正確方法嗎?這會在所有瀏覽器中工作嗎?如何IE瀏覽器?檢查功能中是否缺少參數
function getName(name){
name = name != null ? name : "default";
return name;
}
這是檢查功能中缺少參數的正確方法嗎?這會在所有瀏覽器中工作嗎?如何IE瀏覽器?檢查功能中是否缺少參數
function getName(name){
name = name != null ? name : "default";
return name;
}
你可以這樣做:
name = name || 'default';
說,如果name
未定義或falsy(null
,0
,""
,false
,{}
,[]
),將其設置爲"default"
。我們會抱怨它,但它的作用至少和IE7一樣。它根本不是無效的代碼,或者依賴一些無證的行爲。
這當然會讓謬誤論證看起來「缺失」。根據你在做什麼,這可能意味着很多誤報。 – NullUserException
是的。但是,如果名稱應該是某種東西或「默認」,這保證了它。如果'name'可以是'false','''''或其他空的東西,那麼不會,你不能使用這個方法,但是爲什麼設置一個默認值,如果你不打算用它來捕獲空的或不正確的情況。 – tkone
有些情況下,如果變量未定義,而允許0或空字符串爲有效值,則您希望具有默認值。你在做什麼會不分青紅皁白地屠殺所有的謬誤價值。 – NullUserException
正確的檢查方法是
if (typeof name === "undefined") {
// ...
}
當然致電市民中仍然可以通過調用getName(undefined)
,當提供一個參數,但該檢查將其標記爲仍然沒有提供的「傻瓜」你。但這確實是一種病態情況。
如果你做'name = name || 「default」方法雖然傳入'undefined'仍然可以像你期望的那樣工作。 – tkone
@tkone Jon在談論可能的誤報。 – NullUserException
@NullUserException不是當我離開我的評論。從那時起,答案已被編輯。 – tkone
是的,這將在所有的瀏覽器工作,但如果你想看看它是否被定義您可以使用:
function getName(name){
name = typeof(name) !== "undefined" ? name : "default";
return name;
}
的方式來檢查參數取決於你傳遞到什麼類型的信息函數,以及你希望你的函數如何處理邊界情況。
在大多數情況下,你可以簡單地使用:
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...
}
}
...然而使用鬆散檢查允許兩個null
和undefined
被覆蓋(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...
}
一個人如何在這種情況下界定「正確」?爲了給你最好的答案,我們需要知道參數應該被覆蓋的上下文。 – zzzzBov
最近,我問是否有可能在JavaScript函數中列出每個缺失參數的名稱,並且我在這裏找到了許多有趣的解決方案:http://stackoverflow.com/questions/17387222/ –