È secondo le specifiche.
12.5 L'istruzione if
.....
2. Se ToBoolean (GetValue (exprRef)) è true, allora
un. Restituisce il risultato della valutazione della prima istruzione.
3. Altrimenti,
....
ToBoolean, secondo le specifiche, è
L'operazione astratta ToBoolean converte il suo argomento in un valore di tipo Booleano secondo la Tabella 11:
E quella tabella dice questo sulle stringhe:

Il risultato è falso se l'argomento è la stringa vuota (la sua lunghezza è zero); altrimenti il risultato è vero
Ora, per spiegare perché "0" == falsedovresti leggere l'operatore di uguaglianza, che afferma che ottiene il suo valore dall'operazione astratta GetValue(lref)corrisponde allo stesso per il lato destro.
Che descrive questa parte rilevante come:
se IsPropertyReference (V), quindi
un. Se HasPrimitiveBase (V) è falso, allora lascia che sia il metodo interno [[Get]] di base, altrimenti lascia che get
essere lo speciale metodo interno [[Get]] definito di seguito.
b. Restituisce il risultato della chiamata del metodo get interno utilizzando base come suo valore e passaggio
GetReferencedName (V) per l'argomento
O in altre parole, una stringa ha una base primitiva, che richiama il metodo get interno e finisce per sembrare falsa.
Se si desidera valutare le cose utilizzando l'operazione GetValue, utilizzare ==se si desidera valutare utilizzando ToBoolean, ===(noto anche come operatore di parità "rigoroso")
"0"è una stringa e poiché non è vuota, viene valutata come vera.