Это согласно спецификации.
12.5 The if Statement
.....
2. If ToBoolean(GetValue(exprRef)) is true, then
a. Return the result of evaluating the first Statement.
3. Else,
....
ToBoolean, согласно спецификации, равно
Абстрактная операция ToBoolean преобразует свой аргумент в значение типа Boolean в соответствии с таблицей11:
И эта таблица говорит о строках:
Результат равен false, если аргумент является пустой строкой (еедлина равна нулю);в противном случае результат равен true
Теперь, чтобы объяснить, почему "0" == false
вы должны прочитать оператор равенства, который утверждает, что он получает свое значение от абстрактной операции GetValue(lref)
совпадает с тем же для правой стороны.
Который описывает эту релевантную часть как:
if IsPropertyReference(V), then
a. If HasPrimitiveBase(V) is false, then let get be the [[Get]] internal method of base, otherwise let get
be the special [[Get]] internal method defined below.
b. Return the result of calling the get internal method using base as its this value, and passing
GetReferencedName(V) for the argument
Или, другими словами, строка имеет примитивную базу, которая вызывает внутренний метод get и в конечном итоге выглядит как false.
Если вы хотите оценить вещи с помощью операции GetValue, используйте ==
, если вы хотите оценить с помощью ToBoolean
, используйте ===
(также известный как «строгий» оператор равенства)