Как работает принуждение типа JS?
Я учусь о ==
против ===
и наткнулся на этот ответ, который был очень полезен для понимания концепции. Однако я удивился одному из примеров:
'0' == false // true
Это может иметь смысл, так как ==
не проверяет тип. Но затем я попробовал некоторые возможные приведения в консоли и обнаружил следующее:
Boolean('0') // true
String(false) // "false"
Я бы подумал '0' == false
имеет то же значение истинности, что и '0' === String(false)
, но, похоже, это не так.
Так как же на самом деле работает принуждение? Есть ли более базовый тип, который мне не хватает?
2 ответа
"0"
это строка, содержащая символ 0, это не числовое значение 0
, Единственное значение строкового типа, которое оценивается как false
является ""
,
"0"
это правда
Раздел 9.2 спецификации ECMAScript 262 определяет, как различные типы преобразуются в логические:
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'
в логическое значение (что аналогично использованию !!'0'
). При слабом сравнении '0'
с false
, логическое значение преобразуется в число (как определено здесь). false
при преобразовании в число становится 0
, Это означает, что окончательный расчет '0' == 0
что приравнивается к true
,
Чтобы подвести итог соответствующей части связанного раздела спецификации ECMAScript выше:
- Пусть х =
'0'
и у =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
Чтобы сделать вещи более запутанными для абсолютно нового в мире программирования:
Boolean('false')
true
Boolean('true')
true
Я думаю, что это проще и понятнее в использовании !!
оператор по какой-то причине. Я не знаю, имею ли я смысл, но я никогда не использовал Boolean()
Отвечая на вопрос, я нашел эту тему полезной: разница между == и === в JavaScript