8

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

John Bollinger
  • 160,171
  • 8
  • 81
  • 157
DarkLightA
  • 14,980
  • 18
  • 49
  • 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
  • 18,263
  • 7
  • 55
  • 75
SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
  • 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
  • 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
  • I know this is ancient history but `document.all`? – Pointy Aug 22 '18 at 17:26
  • 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
    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