2012-10-11 30 views
3

我試着去尋找一種創新的方式/補丁,以儘量減少這一行:Javascript命令檢查集中的值?

if(myParam == '1' || myParam == 'a' || myParam == '*' || myParam == '@' || myParam == undefined || myParam == null || myParam == ' ') 
    {... 
    } 

一種解決方案是使用的indexOf - 但它不是跨瀏覽器 (我可以寫我自己的FUNC表現得像indexOf - 但我不想)。

所以我嘗試了inoperator

但在運營商僅涉及對象的屬性名稱指標

所以,我想這(對象屬性):

if(window.lala in { 
    '*': 0, 
    'a': 0, 
    '@': 0, 
    ' ': 0, 
    undefined: 0, 
    null: 0 
}) alert('1') 

,我認爲它工作。

2問題,請:

問題#1

是安全的屬性名稱爲[undefined]或[' ']或[null]它會一直工作嗎?

question#2 有沒有其他解決方案來做到這一點?

(套/開關可得做,我知道...)

回答

1

你有什麼不會爲未定義的工作。您可以擁有一個名爲"undefined"的屬性,但這是一個字符串名稱,而不是實際的undefined值。您可以通過類型轉換獲得匹配,但如果您也有一個名稱爲"undefined"的字符串,它也會匹配,這不是您想要的。

我會建議一個更明確的測試,使用===來避免任何類型轉換。有幾種方法可以做到這一點是稍微比你有什麼更簡潔:

if (myParam === null || myParam === undefined || 
    (myParam && myParam.length == 1 && "1a*@ ".indexOf(myParam) !== -1) { 
    // code here 
} 

也可以使一個數組,你自己的跨瀏覽器功能(或使用Array.indexOf()一個填充工具進行搜索,可容納一個數組所有的值:

function inArray(val, array) { 
    for (var i = 0; i < array.length; i++) { 
     if (array[i] === val) { 
      return(true); 
     } 
    } 
    return(false); 
} 

var testValues = [null, undefined, "1", "a", "*", "@", " "]; 
if (inArray(window.lala, array)) { 
    // your code here 
} 

你可以使用你正在試驗對象的形式,直接使用明確的試驗nullundefined,但我認爲string.indexOf()建議在我的第一個建議是簡單不管怎麼說,這是一個安全的形式。使用對象

if (myParam === null || myParam === undefined || 
    (myParam && (myParam in {"*":0, "1":0, "a":0, "@":0, " ":0})) { 
    // code here 
} 

我的建議將是第一個選項,因爲我認爲它是最乾淨的,並且通過在測試字符串中添加更多字符也很容易進行擴展。

+0

window.lala _is_未定義 –

+0

@RoyiNamir - 但在您的測試對象的屬性名稱不'undefined' 。所有的屬性名都是字符串,所以'undefined!==「undefined」,所以它不會匹配你的對象擡頭。 – jfriend00

+0

我不明白。 '如果(未定義在{ '0':0, '*':0, 'A':0, '@':0, '「:0, 未定義:0, 空:0 })alert('1')//'它會提示 –

1

是否安全屬性名稱是[undefined][' ']或[null]?它會一直工作嗎?

所有屬性名被轉換成字符串,這意味着可以數0和字符串之間'0'而不是值nullundefined)和串'null''undefined')之間不能區分。

處理數字作爲數字串在你的情況可能是罰款,對undefinednull,我只想增加一個額外的測試:

if(value == null || value in exclude) { 
    // ... 
} 

value == nulltrue如果valuenullundefined

0

1:最好使用'undefined'和'null'作爲你的對象的名字,因爲當你用for循環它時,它會檢查屬性的字符串表示形式(你可以檢查它是否執行:

for(prop in obj) typeof(prop) //this will be a string 

2:您還可以將自己的價值觀數組並遞歸:

var vals = ['*', 'a', '@', ' ', undefined, null], param = '@', i = 0; 

function checkVals(param, vals, i) { 
    if (vals[i] && param === vals[i]) { 
     console.log(1); 
     return; 
    } 

    checkVals(param, vals, i + 1); 
} 

checkVals(param, vals, i); 
+1

爲什麼要用遞歸而不是簡單的循環? –

+0

如果你願意,你可以使用簡單的循環。我只是以一種方式顯示如何解決這個問題:) – happyCoda