2017-02-28 88 views
-3

有人可以向我解釋或指向我關於爲什麼以下功能不起作用的文檔?如果那麼邏輯與&& ||

var x = 1; 
 
var y = 2; 
 
var z = 1; 
 

 
function logicTest() { 
 
    if ((x && y && z) === 1) { 
 
    return true; 
 
    } else { 
 
    return false; 
 
    } 
 
} 
 

 
console.log(logicTest())

我知道,我可以按如下鍵入了很長的路要走:

var x = 1; 
 
var y = 2; 
 
var z = 1; 
 

 
function logicTest() { 
 
    if (x === 1 && y === 1 && z === 1) { 
 
    return true; 
 
    } else { 
 
    return false; 
 
    } 
 
} 
 
console.log(logicTest())

但我真的想明白爲什麼首先不起作用,並且如果有更好的方式鍵入第二個if/then語句或者如果是隻是它永遠必須的方式。

謝謝!

+0

任何語言的文檔都無法列出所有無效的語法。 – krillgar

+2

由於'&&'和'||'適用於布爾運算符,因此在第一種情況下,您正嘗試使用整數值運算它們。 在第二種情況下,個別條件解決爲布爾運算並按原樣運行。 –

+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators – mplungjan

回答

2

表達

((x && y && z) === 1) 

首先涉及的(x && y && z)評價。爲了評估這一點,JavaScript測試按順序測試了x,yz的值。如果從左到右,強制爲布爾值的那些值中的一個值爲false,則評估將以該值(未強制)作爲整個值停止。否則,該子表達式的值將是z的值,因爲它是&&序列中的最後一個子表達式。

在這種情況下,xy,並且z是所有非零的數字,所以總的結果將是1,因爲z1

你似乎希望能夠做的就是測試一組子表達式的全部是否等於相同的值。正如你發現的那樣,只能通過明確的比較來確定。這也可以通過創建一個列表然後使用數組函數來執行測試來完成,這在測試不止三個子表達式時非常有用。

而且,在風格上注意:

function logicTest() { 
    if (x === 1 && y === 1 && z === 1) { 
    return true; 
    } else { 
    return false; 
    } 
} 

執行測試關係運算符像===產生布爾值。使用它更簡潔:

function logicTest() { 
    return x === 1 && y === 1 && z === 1; 
} 
+1

我想你可以鏈接Docs以及:http://stackoverflow.com/documentation/javascript/208/comparison-operations/828/logic-operators-with-non-boolean-values-boolean-coercion#t=201702281311439403736 – Rajesh

+0

謝謝我欣賞的解釋和編寫代碼的更好方法。 – Phil