Есть ли в JavaScript ненулевые логические операторы?

В JavaScript

(f1() || f2())

не выполнит f2, если f1 вернет true, что обычно хорошо, за исключением случаев, когда это не так. Существует ли версия ||, которая не замыкает накоротко?

Что-то вроде

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

Ответы

Ответ 1

Нет, 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) - нет, и они производят одно и то же значение.

Ответ 2

Вы можете использовать бит-мудрый ИЛИ, пока ваши функции возвращают логические значения (или это действительно имеет значение?):

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

Я играл с этим здесь: http://jsfiddle.net/sadkinson/E9eWD/1/

Ответ 3

JavaScript имеет один канал (|, побитовое ИЛИ) и одиночные амперсанды (&, побитовое И), которые не имеют короткого замыкания, но опять же они побитовые, а не логические.

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

Ответ 4

Если вам нужно выполнить f2(), независимо от того, является ли f1() истинным или ложным, вы должны просто вызвать его, возвращая логическую переменную и используя это в своем условном выражении. То есть, используйте:   if (f1() || f2IsTrue)

В противном случае используйте одиночный барабан или одиночный амперсанд, как предлагается GregC.