2016-05-26 117 views
0

有人可以向我解釋爲什麼這兩個提醒'真'?我認爲邏輯或是有意義的 - 第一次測試後的OR短路:100!= 90,因此它是真的。爲什麼第一次測試後的AND短路並沒有繼續?JS邏輯和/或

if (100 != 90 && 100 && 190 && 200 && 290){ 
    alert("true"); 
} else { 
    alert("false"); 
} 

if (100 != 90 || 100 || 190 || 200 || 290){ 
    alert("true"); 
} else { 
    alert("false"); 
} 

編輯:謝謝大家的幫助!根據您的建議,我想我會AMMEND我的代碼更改爲:!

var trains = [90,100,190,200,290]; 
var testValue = 100; 

if (trains.indexOf(testValue) >= 0){ 
    alert("true"); 
} 
+1

'如果(!100 = 90 && 100 && 190 && 200 && 290)'所有這些都是truthy。你期望看到什麼發生? –

+3

我懷疑你所犯的錯誤是你認爲'if(100!= 90 && 100)'等於'if(100!= 90 && 100!= 100)'它根本不是 –

+0

正是我需要馬特,謝謝 – user3552105

回答

1

這將評估爲true:

if (100 != 90 && 100 && 190 && 200 && 290) 

因爲每個部分是truthy。 JavaScript中的任何非零值都被認爲等同於true。所以你有:

if (true && true && true && true && true) 

這顯然是真的。這不是短路,因爲沒有任何值是錯誤的。

我懷疑你犯的錯誤是,認爲這樣的:

if (100 != 90 && 100) 

在做同樣的事情,因爲這:

if (100 != 90 && 100 != 100) 

這根本就不是如何的語法著作。很容易用文字說「如果100不等於90並且不等於100」並理解這意味着什麼,但是在JavaScript(以及大多數其他語言)中您必須是明確的。

現在很明顯,如果你有,你需要有價值觀的一個長長的清單來比較值,例如這變得非常乏味:

if (x != 90 && x != 100 && x != 190...) 

而在這樣的情況下,它通常是更容易把所有如果x是該陣列中包含的(或不)的值到一個數組,而不是問:

var values = [90,100,190,...] 

if (!values.some(function(e) { return e === x; })) { 
    // the value x is not in the array values 
} 
+0

感謝您的回答。你給了我一個主意。我可以將所有值添加到數組中,並說出如下所示:(請參閱初始問題中的編輯) – user3552105

0

對於& &,第100 = 90計算爲真。然後,將整數隱式轉換爲bools,其中0 = false,否則爲true。真正的將貫穿數字,其中沒有一個是0.

您的評論關於||是正確的。