Comment by moritzwarhier

1 day ago

I knew this in and out, but as a Full-Stack PHP/Symfony/Frontend/JS guy who pivoted to mainly TS for b2b stuff, I still have to occasionally enter

  !""

into the browser console just to be sure, during code reviews :D

In JS/TS:

    "0" == false : true
    ""  == false : true
    " " == false : true
    "1" == false : false

    !"0" : false
    !"" : true
    !" " : false
    !"1" : false

In PHP:

    "0" == false : true
    ""  == false : true
    " " == false : true
    "1" == false : false

    !"0" : true
    !"" : true
    !" " : false
    !"1" : false

Honestly the only way to remain sane in either, but especially if you use both, is to always use === and never use boolean logic (!) when a string could be involved.

  • That's what I say in code reviews as well. Same for numbers.

    !someValue is useful only for:

    - booleans, including optional booleans (which is why every bool flag should default to false)

    - undefined, null (falsy), or object/function (truthy)

    It's nice for the second variant to also cover falsy NaN or things like this, for example for forms.

    I guess that's where

      !!""===false
    

    comes from.

    But it's this exact case that keeps tripping me up.

    What about empty arrays?

    Per my original comment, now I'd have to look up if

      ![]
    

    is false in PHP, or just empty([]) === true

    .

    So yea I agree, and extend your case to PHP "arrays" (in JS,

      !![] === true
    

    is

      true

    • Obviously it depends what you're working on, what your patterns are, and so on. But my experience is that PHP involves so much array wrangling that devs are more likely to have a handle on what an array will do in this context (an empty array is falsy).

      It's the string ones (in particular that in addition to the empty string, "0" specifically is the only other falsy string) that tend to catch people out.