Remix.run Logo
nasretdinov 3 hours ago

if("0") {} being equivalent to if(false) {} still gives me nightmares even though I've stopped using PHP for at least 6 years now :)

moritzwarhier 3 hours ago | parent | next [-]

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
tredre3 2 hours ago | parent [-]

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.
moritzwarhier 2 hours ago | parent [-]

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
kif 3 hours ago | parent | prev [-]

Also `empty("0") === true` is a common gotcha.