2013-11-04 104 views
1

這兩個條件語句在Javascript中有什麼區別?Javascript價值比較解釋

function comparisonTest() { 
    var value = "A value"; 
    var compare1 = 5; 
    var compare2 = "String"; 
    var compare3 = false; 

    if (value == compare1 || value == compare2 || value == compare3) console.write("True"); 
    else console.write("False"); 
} 

這是因爲它應該 - 它返回false,因爲值不匹配。但是,當我改變條件爲以下...

function comparisonTest() { 
    var value = "A value"; 
    var compare1 = 5; 
    var compare2 = "String"; 
    var compare3 = false; 

    if (value == compare1 || compare2 || compare3) console.write("True"); 
    else console.write("False"); 
} 

總是回報True。我認爲也許會有更短的方式來編寫多重比較的條件(雖然循環會正常工作),但這顯然不是一種解決方法。

幕後發生了什麼,或者說它是如何被解釋的,以至於在第二種情況下,它總是返回真實?我聲明的所有值都不是1true,所以這絕對不是問題。

+0

這是一個邏輯運算符。你不能那樣做。 – SLaks

+0

這個問題實際上與||相關運算符,而不是相等。 – RobG

回答

1

不幸的是,我不相信有一個簡短的方法來在JavaScript中編寫條件。

第二個示例返回true的原因是因爲當您評估compare2時,這是JavaScript中的truthy值。

我推薦這post約truthy和falsey值在JavaScript

順便說一句,你可能想在JavaScript

+0

我很快就會接受這個答案 - 謝謝你的參考;我不知道Javascript中存在'truthy'和'falsey'值...這很有趣,當我使用Javascript時,我會記住它!我從@ jfriend00那裏得到了這個答案,因爲你給了我一個實際解釋這些值是什麼以及它們的含義的參考。 –

2

這是因爲這樣的:

if (value == compare1 || compare2 || compare3) 

是一樣的:

if ((value == compare1) || compare2 || compare3) 

而且,你會看到compare2是滿足||運營商truthy值。請參閱this MDN article on operator precedence爲什麼==首先得到評估,這會使您的第一個代碼塊正常工作,但會讓您的第二個代碼塊像我所顯示的那樣進行評估。


如果你想所有的人都比較value,你有一個像你在你的第一個代碼塊做了,你單獨比較value每個人寫出來的速記方式。


您可能還需要考慮使用===更多的時候,那麼你就不必擔心可能的類型轉換使事情等於你從來都不是相等的。除非有明確的理由需要類型轉換,否則我有自己編碼的指導原則總是使用===!==。我相信這可以節省一些意外的錯誤。有關更多信息,請參閱here

+0

感謝您對第二個條件的評估,以瞭解編譯器如何解釋它 - 我想知道它是如何確定評估的。另外,我感謝您指出使用'===',但是在這種情況下,我知道類型轉換不是問題。同樣,我已經讀過這個問題,但是謝謝你將它鏈接起來! –

+0

@ChrisCirefice - 你可能會發現這篇關於JavaScript中的運算符優先級的文章很有用:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence – jfriend00

+0

等式運算符的選擇在這裏並不重要。 – RobG

2

這裏尋找到的區別=====之間的另一種選擇:

function comparisonTest() { 
    var value = "A value"; 

    var answers = [5, "String", false]; 

    /* IE may requires shim found here: 
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf 
    */ 
    if (answers.indexOf(value) === -1) { 
    // False 
    } else { 
    // True 
    } 
} 
+0

這太棒了!實際上,這正是我所需要的。我有一個約100個比較字符串的列表,我先前將其放入一個數組並循環(馬虎);這是*多*更優雅,謝謝:) –

+0

我是請。別客氣。 –

+0

通常的ES5警告應該包括在內,但無論如何+1。 :-) – RobG