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 && bevaluates to the first falsy operand,
- a || bevaluates 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.
- !aevaluates to- trueif- ais falsy and- falseif- ais 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