I don't understand how &&
, ||
, and !
work... both with bools and other data types. How do you use them?
Asked
Active
Viewed 5,097 times
3
![](../../users/profiles/2402272.webp)
John Bollinger
- 121,924
- 8
- 64
- 118
![](../../users/profiles/542308.webp)
DarkLightA
- 13,036
- 16
- 47
- 54
2 Answers
9
All values in Javascript are either "truthy" or "falsy".
a && b
evaluates to the first falsy operanda || 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, it 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:
false
+0
-0
NaN
""
null
undefined
document.all
![](../../users/profiles/4642212.webp)
Sebastian Simon
- 14,320
- 6
- 42
- 61
![](../../users/profiles/34397.webp)
SLaks
- 800,742
- 167
- 1,811
- 1,896
-
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
-
1@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
-
2@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
-
I know this is ancient history but `document.all`? – Pointy Aug 22 '18 at 17:26
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).
![](../../users/profiles/61974.webp)
Mark Byers
- 719,658
- 164
- 1,497
- 1,412
-
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