Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.
Пример:
string value = null;
if (value.Length == 0) // <-- Causes exception
{
Console.WriteLine(value); // <-- Never reached
}
Ошибка исключения:
Необработанное исключение:
System.NullReferenceException: ссылка на объект не установлена в экземпляр объекта. в Program.Main ()
blockquote>
Он отбрасывается в булеан. Любая непустая строка оценивает значение true.
Из Спецификация языка ECMAScript :
12.5 Оператор
if
Семантика
Произведение IfStatement :
if (
Выражение)
Statementelse
Statement оценивается следующим образом:
- Пусть exprRef является результатом оценки выражения .
- Если ToBoolean (GetValue ( exprRef )) истинно, затем возвращает результат оценки первого Statement .
- Else, Вернуть результат оценки второго Statement .
9.2 ToBoolean
Абстрактная операция ToBoolean преобразует свой аргумент в значение типа Boolean в соответствии с таблицей 11:
Таблица 11 - Конверсии ToBoolean
Undefined: false Null: false Boolean: результат равен входному аргументу (без преобразования). Number: Результат равен false, если аргумент равен +0, -0 или NaN; иначе результат будет правдой. String: результат является ложным, если аргумент является пустой строкой (ее длина равна нулю); иначе результат будет правдой. Object: true
blockquote>
Что касается оператора
==
, это сложно, но суть в том, что, если вы сравниваете число с не номером, последнее преобразуется в число. Если вы сравниваете логическое значение с небулевым, логическое значение сначала преобразуется в число, а затем применяется предыдущее предложение.Подробности см. В разделе 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)
Я думаю, что это происходит, потому что в первом примере ваша «строка» - это ненулевой объект, который в этом контексте переводится в true, тогда как во втором примере вы спрашиваете, является ли этот объект String одинаковым как объект Boolean, которого нет, поэтому он переводится как false.
if ("string"===true)
Должен быть написан таким образом.
"string" - это строка, которая не является нулевой. В JavaScript все значения, не равные нулю, оцениваются как «истинные». Итак: if («string») является таким же, как если бы («string»! = Null), но «string» не соответствует true, это все равно строковое значение.
if ("string") {
console.log('true!');
}
Как вы уже знаете, если оценивает логическое выражение. Поэтому он проверяет
if((Boolean)"string")
Так как строка (bool) истинна, она проходит. Но в случае
if ("string"==true) {
console.log('true!');
}
Вы пытаетесь приравнять строку с bool, которая, очевидно, сравнивает их и возвращает false.
Потому что его JavaScript такой. Ознакомьтесь со всеми связанными вопросами в правой части этой страницы.
Из ссылки ECMA 262, если вы неявно преобразовываете String в Boolean, а String отличается от пустой String, она будет оценивать значение true.
Проверить здесь
Непустые строки являются правдивыми, но не обязательно эквивалентны true
.
==
является «мягким» оператором равенства. Он использует принуждение типа, чтобы сравнить два эквивалентных объекта как равные.
Все следующее верно:
42 == "42"
0 == false
0 == ""
[] == ""
{} == "[object Object]"
"1" == true
Аргументные строки не эквивалентны никаким примитивным значениям. Однако
Когда вы пишете if (something)
, if
будет выполняться, если something
является «правдивым».
Все значения правдивы, кроме следующих:
false
0
NaN
""
null
undefined
Простой:
if("string")
оценивается как булев. Любое значение, которое не является false
, равно true
, никакого преобразования в число или что-либо в этом роде.
Сравнение "string"
с логическим значением true
, очевидно, даст false
.