Jest to zgodne ze specyfikacją.
12.5 Instrukcja if
.....
2. Jeśli ToBoolean (GetValue (exprRef)) jest prawdziwe, to
za. Zwraca wynik oceny pierwszej instrukcji.
3. W przeciwnym razie
…
ToBoolean, zgodnie ze specyfikacją, to
Abstrakcyjna operacja ToBoolean konwertuje swój argument na wartość typu Boolean zgodnie z tabelą 11:
I ta tabela mówi o ciągach:
Wynik jest fałszywy, jeśli argument jest pustym ciągiem (jego długość wynosi zero); w przeciwnym razie wynik jest prawdziwy
Teraz, aby wyjaśnić, dlaczego "0" == false
powinieneś przeczytać operator równości, który stwierdza, że pobiera swoją wartość z operacji abstrakcyjnej, jest GetValue(lref)
taki sam dla prawej strony.
Który opisuje tę istotną część jako:
jeśli IsPropertyReference (V), to
za. Jeśli HasPrimitiveBase (V) ma wartość false, to niech get będzie [[Get]] wewnętrzną metodą bazową, w przeciwnym razie niech get
być specjalną wewnętrzną metodą [[Get]] zdefiniowaną poniżej.
b. Zwraca wynik wywołania metody get get przy użyciu wartości base jako tej wartości i przekazania
GetReferencedName (V) dla argumentu
Innymi słowy, łańcuch ma prymitywną podstawę, która wywołuje wewnętrzną metodę get i kończy się na fałszu.
Jeśli chcesz oceniać rzeczy za pomocą operacji GetValue użyj ==
, jeśli chcesz oceniać za pomocą ToBoolean
, użyj ===
(również znany jako „ścisły” operator równości)
"0"
jest ciągiem, a ponieważ nie jest pusty, jest sprawdzany jako prawdziwy.