Почему if ('string') - True, а 'string' == true - False? [Дубликат]

Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.

Пример:

string value = null;
if (value.Length == 0) // <-- Causes exception
{
    Console.WriteLine(value); // <-- Never reached
}

Ошибка исключения:

Необработанное исключение:

System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в Program.Main ()

31
задан munchybunch 7 February 2011 в 17:22
поделиться

9 ответов

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

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

12.5 Оператор if

Семантика

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

  1. Пусть exprRef является результатом оценки выражения .
  2. Если ToBoolean (GetValue ( exprRef )) истинно, затем возвращает результат оценки первого Statement .
  3. Else, Вернуть результат оценки второго Statement .

9.2 ToBoolean

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

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

Undefined: false Null: false Boolean: результат равен входному аргументу (без преобразования). Number: Результат равен false, если аргумент равен +0, -0 или NaN; иначе результат будет правдой. String: результат является ложным, если аргумент является пустой строкой (ее длина равна нулю); иначе результат будет правдой. Object: 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)
55
ответ дан John Kugelman 24 August 2018 в 01:50
поделиться

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

0
ответ дан Aleksey Vitebskiy 24 August 2018 в 01:50
поделиться
if ("string"===true)

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

1
ответ дан Archinamon 24 August 2018 в 01:50
поделиться

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

0
ответ дан Krumelur 24 August 2018 в 01:50
поделиться
if ("string") {
    console.log('true!');
}

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

if((Boolean)"string")

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

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

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

0
ответ дан naveen 24 August 2018 в 01:50
поделиться

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

-8
ответ дан powtac 24 August 2018 в 01:50
поделиться

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

Проверить здесь

0
ответ дан PW. 24 August 2018 в 01:50
поделиться

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


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

Все следующее верно:

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

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


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

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

  • false
  • 0
  • NaN
  • ""
  • null
  • undefined
8
ответ дан SLaks 24 August 2018 в 01:50
поделиться

Простой:

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

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

0
ответ дан Yuval Adam 24 August 2018 в 01:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: