Double exclamation points?

Possible Duplicate:
What is the !! (not not) operator in JavaScript?
What does the !! operator (double exclamation point) mean in JavaScript?

So I was debuging some code and ran across this:

var foo.bar = 0; // this is actually passed from another function, adding it for context

function(foo)
    var someVar = !!foo.bar;
    if(foo.bar){
      // ..stuff happens
    }
    else{
      // .. something else happens
    }
}

Okay my questions is what is the point of !!? All that is doing is making the 0 === false .

  • Is there any benefit to using that compared to boolean(foo.bar) ?

  • foo.bar can be evaluated in an if as is because 0 === false already, so why go through the conversion? (someVar is not reused anywhere else)


  • This converts a value to a boolean and ensures a boolean type .

    "foo"      =    "foo"
    !"foo"     =    false
    !!"foo"    =    true
    

    If foo.bar is passed through, then it may not be 0 but some other falsy value. See the following truth table:

    Truth Table for javascript

    ''        ==   '0'           // false
    0         ==   ''            // true
    0         ==   '0'           // true
    false     ==   'false'       // false
    false     ==   '0'           // true
    false     ==   undefined     // false
    false     ==   null          // false
    null      ==   undefined     // true
    " trn" ==   0             // true
    

    Source: Doug Crockford

    Javascript also gets really weird when it comes to NaN values. And this is the only case I can think of off the top of my head where !! would behave differently to ===.

    NaN   ===  NaN     //false
    !!NaN === !!NaN    //true
    
    // !!NaN is false
    

    I think the answer is that there isn't really much point. We can speculate about how it came about:

  • maybe an earlier version of the function used someVar in multiple places, or in ways that genuinely benefited from having true or false , so this made more sense.
  • maybe the person who wrote the function is so used to using !! to convert to true / false that (s)he didn't even notice that it wasn't necessary here.
  • maybe the person who wrote the function feels that every computation (in this case, Boolean conversion) should be given a meaningful name by assigning some variable to its result.
  • maybe, since Boolean conversion in JavaScript is surprisingly error-prone (in that eg new Boolean(false) is a true-valued value), the person who wrote the function feels that it should always be done explicitly rather than implicitly — even though the effect is the same — just to call attention to it as a potential point of error.
  • this, of course, presupposes that the person who wrote the function thinks of !! as an "explicit" Boolean conversion. Technically it's not — it uses the same implicit Boolean conversion that if does — but if you&#ȍ 链接地址: http://www.djcxy.com/p/12640.html

    上一篇: JavaScript中的双重否定(!!)

    下一篇: 双感叹号?