Está de acordo com as especificações.
12.5 A declaração if
.....
2. Se ToBoolean (GetValue (exprRef)) for verdadeiro, então
uma. Retorne o resultado da avaliação da primeira instrução.
3. Senão,
....
ToBoolean, de acordo com as especificações, é
A operação abstrata ToBoolean converte seu argumento em um valor do tipo Booleano, de acordo com a Tabela 11:
E essa tabela diz isso sobre strings:
O resultado é falso se o argumento for a String vazia (seu comprimento é zero); caso contrário, o resultado é verdadeiro
Agora, para explicar por que "0" == false
você deve ler o operador de igualdade, que afirma que ele obtém seu valor da operação abstrata GetValue(lref)
corresponde ao mesmo para o lado direito.
Que descreve esta parte relevante como:
se IsPropertyReference (V), então
uma. Se HasPrimitiveBase (V) for falso, então get seja o método interno da [[Get]] base, caso contrário, deixe get
seja o método interno especial [[Get]] definido abaixo.
b. Retorne o resultado de chamar o método interno get usando base como este valor e passando
GetReferencedName (V) para o argumento
Ou, em outras palavras, uma string tem uma base primitiva, que chama de volta o método get interno e acaba parecendo falsa.
Se você deseja avaliar coisas usando a operação GetValue ==
, se você deseja avaliar usando o ToBoolean
, use ===
(também conhecido como operador de igualdade "estrito")
"0"
é uma sequência e, como não está vazia, é avaliada como verdadeira.