3

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

John Bollinger
  • 121,924
  • 8
  • 64
  • 118
DarkLightA
  • 13,036
  • 16
  • 47
  • 54

2 Answers2

9

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, it 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:

  • false
  • +0
  • -0
  • NaN
  • ""
  • null
  • undefined
  • document.all
Sebastian Simon
  • 14,320
  • 6
  • 42
  • 61
SLaks
  • 800,742
  • 167
  • 1,811
  • 1,896
  • 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
  • 719,658
  • 164
  • 1,497
  • 1,412
  • 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