Ответ 1
"0"
- это строка, содержащая символ 0, это не числовое значение 0
. Единственное значение типа строки, которое оценивается как false
, равно ""
.
"0"
truthy.
Раздел 9.2 спецификации ECMAScript 262 определяет, как различные типы преобразуются в Boolean:
Argument Type Result
Undefined false
Null false
Boolean The result equals the input argument (no conversion).
Number The result is false if the argument is +0, −0, or NaN; otherwise the
result is true.
String The result is false if the argument is the empty String (its length is
zero); otherwise the result is true.
Object true
Это, однако, строго соблюдается при сравнении с использованием ===
.
При использовании Boolean('0')
вы преобразовываете значение '0'
в Boolean (что совпадает с использованием !!'0'
). При слабое сравнение '0'
с false
, булево значение преобразуется в число (как определено здесь). false
, при преобразовании в число, становится 0
. Это означает, что окончательный расчет равен '0' == 0
, который равен true
.
Подводя итог соответствующей части связанного раздела указанной выше спецификации ECMAScript:
- Пусть x =
'0'
и y =false
. - Проверьте, является ли тип y логическим.
- Если true, преобразуйте y в число.
- Сравните x с числовым эквивалентом y.
В нашем случае реализация JavaScript будет следующей:
var x = '0', // x = "0"
y = false; // y = false
if (typeof y === "boolean") {
y = +y; // y = 0
}
console.log( x == y ); // "0" == 0
-> true