Как работает принуждение типа JS?

Я узнаю о == vs. === и наткнулся на этот ответ, который очень помог в понимании концепции. Однако я задавался вопросом об одном из примеров:

'0' == false     // true

Это может иметь смысл, поскольку == не проверяет тип. Но затем я попробовал некоторые возможные принуждения в консоли и нашел следующее:

Boolean('0')     // true
String(false)    // "false"

Я бы подумал, что '0' == false имеет то же значение истинности, что и '0' === String(false), но это, похоже, не так.

Итак, как действует принуждение? Есть ли более простой тип, который мне не хватает?

Ответы

Ответ 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

Ответ 2

Чтобы сделать вещи более запутанными для совершенно нового в мире программирования:

Boolean('false')
true

Boolean('true')
true

Я думаю, что проще и интуитивно использовать оператор !! по какой-то причине. Я не знаю, имеет ли смысл, но я никогда не использовал Boolean()

Отвечая на вопрос, я нашел, что поток полезен: Разница между == и === в JavaScript