2016-05-26 77 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.

您的评论关于||是正确的。