Как работает принуждение типа 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 выше:

  1. Пусть х = '0' и у = false,
  2. Проверьте, является ли тип y булевым.
  3. Если true, конвертируйте y в число.
  4. Сравните 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

Другие вопросы по тегам