我的对象在属性HelloWorld
中包含字符串hello
。我想检查两个字符串,如果它与任何一个都不匹配,那么我想执行某些代码。
var item = { hello: "HelloWorld" }
item.hello !== "HelloWorld" && item.hello !== "GoodbyeWorld" // false, correct
但是,我觉得这可以优化并且更具可读性:
item.hello !== ("GoodbyeWorld" && "HelloWorld") // false, correct
item.hello !== ("HelloWorld" && "GoodbyeWorld") // true WTF?
我预计这两个检查都是假的,但我肯定在这里遗漏了一些东西。我想我对javascript中的AND / OR运算符没有正确的理解,或者我以错误的方式使用括号。谁能解释一下?
答案 0 :(得分:3)
"HelloWorld" && "GoodbyeWorld"
的结果是"GoodbyeWorld"
这就是为什么你得到的结果,你以前的方式是最简单的解决方案
答案 1 :(得分:3)
我们来看看这一行
item.hello !== ("HelloWorld" && "GoodbyeWorld") // true WTF?
如果lVal
是真值,则逻辑AND运算符会计算其右操作数。
注意,真值是每个非麻痹的值(null,false,0,"",undefined,NaN
)
因为"HelloWorld"
确实是真实的
表达式("HelloWorld" && "GoodbyeWorld")
的评估结果为"GoodbyeWorld"
,您正在有效地比较
item.hello !== "GoodbyeWorld"
可以缩减为"HelloWorld" !== "GoodbyWorld"
因此,是true
但是,如果您使用的是ES5兼容环境,则可以使用Array.prototype.indexOf
来简化它。
!~["HelloWorld","GoodbyWorld"].indexOf(item.hello) //false
如果数组中未包含item.hello
答案 2 :(得分:1)
item.hello !== "HelloWorld" && item.hello !== "GoodbyeWorld"
是测试item.hello
是否与"HelloWorld"
和"GoodbyeWorld"
不同的正确方法。
JavaScript中的表达式A && B
会产生A
或B
的结果,并且该结果与您的item.hello
进行比较。
答案 3 :(得分:1)
不,你不能那样优化表达。你正在做的是消除其中一个字符串,这样你只进行了一次比较。
&&运算符使用短路评估,这意味着如果第一个操作数是真实的,它将只返回第二个操作数。
所以,你的代码所做的是将hello属性值与第二个字符串进行比较,这解释了你得到的结果。