24

在 JavaScript 中

(f1() || f2())

f2如果f1返回则不会执行,true这通常是一件好事,除非它不是。有||没有不短路的版本?

就像是

var or = function(f, g){var a = f(); var b = g(); return a||b;}
4

4 回答 4

12

不,JavaScript 不像 Java,唯一的逻辑运算符是短路的

https://developer.mozilla.org/en/JavaScript/Reference/Operators/Logical_Operators

也许这可以帮助你:

http://cdmckay.org/blog/2010/09/09/eager-boolean-operators-in-javascript/

| a     | b     | a && b | a * b     | a || b | a + b     |
|-------|-------|--------|-----------|--------|-----------|
| false | false | false  | 0         | false  | 0         |
| false | true  | false  | 0         | true   | 1         |
| true  | false | false  | 0         | true   | 1         |
| true  | true  | true   | 1         | true   | 2         |

| a     | b     | a && b | !!(a * b) | a || b | !!(a + b) |
|-------|-------|--------|-----------|--------|-----------|
| false | false | false  | false     | false  | false     |
| false | true  | false  | false     | true   | true      |
| true  | false | false  | false     | true   | true      |
| true  | true  | true   | true      | true   | true      |

基本上(a && b)是短路,而!!(a + b)不是,它们产生相同的值。

于 2011-04-13T16:21:14.007 回答
3

只要您的函数返回布尔值(或者这真的很重要吗?),您就可以使用按位或:

if (f1() | f2()) {
    //...
}

我在这里玩过这个:http: //jsfiddle.net/sadkinson/E9eWD/1/

于 2011-04-13T16:25:07.533 回答
2

JavaScript 确实有非短路的单管道 ( |, 按位 OR) 和单 & 运算符 ( , 按位 AND ),但同样它们是按位的,不合逻辑的。&

http://www.eecs.umich.edu/~bartlett/jsops.html

于 2011-04-13T16:25:33.000 回答
1

如果您需要 f2() 运行而不管 f1() 是真还是假,您应该简单地调用它,返回一个布尔变量,并在条件中使用它。也就是说,使用: if (f1() || f2IsTrue)

否则,请按照 GregC 的建议使用单条或单与号。

于 2011-04-13T16:25:08.267 回答