Почему 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 имеет смысл, но я не понимаю, почему первый оператор вызывает оценку внутреннего цикла. Что здесь происходит?
Ответы
Ответ 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 такой. Ознакомьтесь со всеми связанными вопросами в правой части этой страницы.