Подтвердить что ты не робот

Почему if ( "string" ) оценивает "string" как true, но если ( "string" == true) нет?

С учетом следующего кода:

if ("string") {
    console.log('true!');
}
//logs "true" to the console
if ("string"==true) {
    console.log('true!');
}
//doesn't log anything

Почему это происходит? Я думал, что "string" было добавлено к числу, как и булево. Итак, true становится 1, а "string" становится NaN. Второй оператор if имеет смысл, но я не понимаю, почему первый оператор вызывает оценку внутреннего цикла. Что здесь происходит?

4b9b3361

Ответ 1

Он добавляется к булеву. Любая непустая строка оценивается как true.

Из Спецификация языка ECMAScript:

12.5 Оператор if

Семантика

Производственное IfStatement: if ( Выражение ) Statement else Заявление оценивается следующим образом:

  • Пусть exprRef - результат вычисления выражения.
  • Если ToBoolean (GetValue (exprRef)) true, тогда
    • Возвращает результат вычисления первого оператора.
  • В противном случае,
    • Возвращает результат оценки второго заявления.

9.2 ToBoolean

Абстрактная операция ToBoolean преобразует свой аргумент в значение типа Boolean в соответствии с таблицей 11:

Таблица 11 - Конверсии ToBoolean

Undefined: false
Null: false
Boolean: результат равен входному аргументу (без преобразования).
Number: Результат false, если аргумент +0, -0 или NaN; в противном случае результат true.
String: результат false, если аргументом является пустая строка (ее длина равна нулю); в противном случае результат true.
Объект: истина


Что касается оператора ==, это осложняется, но суть его в том, что если вы сравниваете число с не числом, последнее преобразуется в число. Если вы сравниваете логическое значение с небулевым, логическое значение сначала преобразуется в число, а затем применяется предыдущее предложение.

Подробнее см. раздел 11.9.3.

// Call this x == y.
if ("string" == true) 

// Rule 6: If Type(y) is Boolean,
//         return the result of the comparison x == ToNumber(y).
if ("string" == Number(true))

// Rule 5: If Type(x) is String and Type(y) is Number,
//         return the result of the comparison ToNumber(x) == y.  
if (Number("string") == Number(true))

// The above is equivalent to:
if (NaN == 1)

// And NaN compared to *anything* is false, so the end result is:
if (false)

Ответ 2

Непустые строки являются правдивыми, но не обязательно эквивалентны true.


== является "мягким" оператором равенства. Он использует принуждение типа для сравнения двух эквивалентных объектов как равных.

Все верно:

42 == "42"
0 == false
0 == ""
[] == ""
{} == "[object Object]"
"1" == true

Ариптивные строки не эквивалентны никаким примитивным значениям. Однако


Когда вы пишете if (something), if будет выполняться, если something является "правдивым".

Все значения правдивы, кроме следующих:

  • false
  • 0
  • NaN
  • ""
  • null
  • undefined

Ответ 3

if ("string"===true)

Должен быть написан таким образом.

Ответ 4

"string" - это строка, которая не является нулевой. В JavaScript все значения, не равные нулю, оцениваются как "истинные". Итак: if ( "string" ) является таким же, как если бы ( "string" != Null), но "string" не соответствует true, это все равно строковое значение.

Ответ 5

Я думаю, что это происходит, потому что в первом примере ваша "строка" - это ненулевой объект, который в этом контексте преобразуется в true, тогда как во втором примере вы спрашиваете, является ли этот объект String одинаковым как булевой объект, которого нет, поэтому он преобразуется в false.

Ответ 6

if ("string") {
    console.log('true!');
}

Как вы уже знаете, если оценивает логическое выражение. Поэтому он проверяет

if((Boolean)"string")

Так как строка (bool) истинна, она проходит. Но в случае

if ("string"==true) {
    console.log('true!');
}

Вы пытаетесь приравнять строку с bool, которая, очевидно, сравнивает их и возвращает false.

Ответ 7

Из ссылки ECMA 262, если вы неявно преобразовываете String в Boolean, а String отличается от пустой String, она будет оцениваться как true.

Отметьте здесь

Ответ 8

Простой:

if("string") оценивается как логическое. Любое значение, которое не равно false, равно true, никакого преобразования в число или что-либо в этом роде.

Сравнение "string" с булевым значением true, очевидно, даст false.

Ответ 9

Потому что его JavaScript такой. Ознакомьтесь со всеми связанными вопросами в правой части этой страницы.