I don't understand how &&
, ||
, and !
work... both with bools and other data types. How do you use them?
Asked
Active
Viewed 6,504 times
8

John Bollinger
- 160,171
- 8
- 81
- 157

DarkLightA
- 14,980
- 18
- 49
- 57
-
Closely related: [Does JavaScript have "Short-circuit" evaluation?](/q/12554578/4642212). – Sebastian Simon Nov 06 '22 at 12:06
2 Answers
12
All values in JavaScript are either “truthy” or “falsy”.
a && b
evaluates to the first falsy operand,a || b
evaluates to the first truthy operand.
Both operators will not evaluate any operands after the one the return. If all operands don’t match, they will evaluate to the last one.
!a
evaluates totrue
ifa
is falsy andfalse
ifa
is truthy.
All values are truthy except the following, which are falsy:
null
undefined
false
+0
-0
NaN
0n
""
document.all

Sebastian Simon
- 18,263
- 7
- 55
- 75

SLaks
- 868,454
- 176
- 1,908
- 1,964
-
1It should state "All *values* are truthful...", since i.e. `undefined` is a value, but there's also the variable `undefined` which holds this value, by default. Also `NaN` is not equal to anything, not even to itself. – Ivo Wetzel Dec 26 '10 at 22:33
-
2@Ivo: 1: Fixed. 2: That's irrelevant; `!NaN` is `true`, so `NaN` is falsy. – SLaks Dec 26 '10 at 22:38
-
Still NaN == NaN is false. So it's still a special case from the above list one might think that NaN works like every other falsy value. – Ivo Wetzel Dec 26 '10 at 23:33
-
3@Ivo: SLaks is only listing JavaScript's falsy values. He isn't claiming anything else about `NaN` or any of the other values. – Sasha Chedygov Dec 26 '10 at 23:40
-
-
1@Pointy - It's a quirk of web history. :-) Early on, `document.all` was a Microsoft-ism and IE didn't support the fledgling DOM standard, so code would do `if (document.all) { /* MS-specific code */ } else { /* DOM standard code */ }`. Time moved on and A) MS implemented DOM standards, and B) Other browsers added `document.all` to support code that relied on it unconditionally. But the code in those pages didn't move on. To avoid having code written like that taking the Microsoft-only branch, Chrome and Firefox made `document.all` *falsy*. Eventually so did IE. It's been standardized now. :-D – T.J. Crowder Sep 21 '22 at 07:57
1
If you want to test that both of two conditions are truthy then use &&:
if (isX && isY)
{
// Do something.
}
If you want to test that one or both of two conditions are truthy then use ||:
if (isX || isY)
{
// Do something.
}
The !
inverts a boolean (a truthy value becomes false and vice versa).

Mark Byers
- 811,555
- 193
- 1,581
- 1,452
-
2
-
@DarkLightA: I'd suggest that you don't write code like that! It causes implicit conversions and it will confuse everyone. – Mark Byers Dec 26 '10 at 22:31
-
2It shouldn't confuse anyone. Short-circuiting has been a common idiom in javascript since around 5 years ago. Crockford calls `||` the default operator so `"Cat" || "Dog"` should read `cat, defaults to dog`. Personally I read it as `cat, otherwise dog`. – slebetman Dec 27 '10 at 00:33