6

I don't understand how &&, ||, and ! work... both with bools and other data types. How do you use them?

John Bollinger
  • 138,022
  • 8
  • 74
  • 138
DarkLightA
  • 14,122
  • 17
  • 48
  • 57

2 Answers2

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 to true if a is falsy and false if a is truthy.

All values are truthy except the following, which are falsy:

  • null
  • undefined
  • false
  • +0
  • -0
  • NaN
  • 0n
  • ""
  • document.all
Sebastian Simon
  • 16,564
  • 7
  • 51
  • 69
SLaks
  • 837,282
  • 173
  • 1,862
  • 1,933
  • 1
    It 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).

Mark Byers
  • 767,688
  • 176
  • 1,542
  • 1,434
  • 2
    What about `document.write("Cat"||"Dog")`? – DarkLightA Dec 26 '10 at 22:27
  • @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
  • 2
    It 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