Это в соответствии со спецификацией.
12.5 Оператор if
.....
2. Если ToBoolean (GetValue (exprRef)) равен true, тогда
а. Вернуть результат оценки первого утверждения.
3. Остальное,
....
ToBoolean, согласно спецификации, это
Абстрактная операция ToBoolean преобразует свой аргумент в значение типа Boolean в соответствии с таблицей 11:
И эта таблица говорит о строках:
Результат равен false, если аргумент является пустой строкой (его длина равна нулю); в противном случае результат верен
Теперь, чтобы объяснить, почему "0" == false
вы должны прочитать оператор равенства, который заявляет, что он получает свое значение от абстрактной операции, GetValue(lref)
совпадает с правой стороной.
Который описывает эту соответствующую часть как:
если IsPropertyReference (V), то
а. Если HasPrimitiveBase (V) имеет значение false, пусть get будет внутренним методом [[Get]] для base, в противном случае пусть get
быть специальным внутренним методом [[Get]], определенным ниже.
б. Вернуть результат вызова метода get internal с использованием base в качестве значения this и передачи
GetReferencedName (V) для аргумента
Или, другими словами, строка имеет примитивную базу, которая вызывает внутренний метод get и в конечном итоге выглядит как false.
Если вы хотите оценить вещи, используя операцию GetValue, используйте ==
, если вы хотите оценить, используя ToBoolean
, используйте ===
(также известный как «строгий» оператор равенства)
"0"
является строкой, и поскольку она не пустая, она оценивается как true.