3

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 运算符没有正确理解,或者我以错误的方式使用括号。谁能解释一下?

JSFiddle 示例

4

4 回答 4

3

结果"HelloWorld" && "GoodbyeWorld"就是"GoodbyeWorld"这就是为什么你得到你的结果,你以前的做法是最简单的解决方案

于 2013-09-30T07:59:48.983 回答
3

我们来看看这条线

item.hello !== ("HelloWorld" && "GoodbyeWorld") // true WTF?

逻辑AND运算符评估其右操作数,如果lVal是真值。

请注意,真值是所有非假值 ( 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如果不包含在数组中,则上述返回 true

于 2013-09-30T07:59:55.170 回答
1

不,你不能那样优化表达式。您正在做的是消除其中一个字符串,以便您只进行其中一个比较。

&& 运算符使用短路求值,这意味着如果第一个操作数为真,它将只返回第二个操作数。

因此,您的代码所做的是将 hello 属性值与第二个字符串进行比较,这解释了您得到的结果。

于 2013-09-30T08:01:22.360 回答
1
item.hello !== "HelloWorld" && item.hello !== "GoodbyeWorld"

是测试是否与和item.hello不同的正确方法。"HelloWorld""GoodbyeWorld"

JavaScript 中的表达式A && B产生一个结果,要么是要么AB它就是那个结果,与你的item.hello.

于 2013-09-30T07:57:10.717 回答