Es de acuerdo a las especificaciones.
12.5 La declaración if
.....
2. Si ToBoolean (GetValue (exprRef)) es verdadero, entonces
a. Devuelve el resultado de evaluar la primera declaración.
3. De lo contrario,
....
ToBoolean, según las especificaciones, es
La operación abstracta ToBoolean convierte su argumento a un valor de tipo booleano según la Tabla 11:
Y esa tabla dice esto sobre cadenas:
El resultado es falso si el argumento es la cadena vacía (su longitud es cero); de lo contrario el resultado es verdadero
Ahora, para explicar por "0" == false
qué debería leer el operador de igualdad, que establece que su valor de la operación abstracta GetValue(lref)
coincide con el lado derecho.
Que describe esta parte relevante como:
si IsPropertyReference (V), entonces
a. Si HasPrimitiveBase (V) es falso, entonces vamos a ser el método interno de base [[Get]], de lo contrario, vamos a obtener
sea el método interno especial [[Get]] definido a continuación.
si. Devuelve el resultado de llamar al método interno get usando base como su valor, y pasando
GetReferencedName (V) para el argumento
O, en otras palabras, una cadena tiene una base primitiva, que vuelve a llamar al método interno get y termina pareciendo falso.
Si desea evaluar las cosas usando la operación GetValue use ==
, si desea evaluar usando el ToBoolean
uso, ===
(también conocido como el operador de igualdad "estricto")
"0"
es una cadena y, como no está vacía, se evalúa como verdadera.