Является {} == true или нет в javascript?

Может кто-нибудь объяснить, почему в javascript,

alert({} == true) показывает false

if ({}) alert('true') показывает true?

Чем отличается условие if, изменяющее результат?

Я хотел написать некоторый валидатор стенографических аргументов obj || (obj = {});, и я был озадачен этим открытием.

5 ответов

if ({}) alert('true')true

{} - это объект, который при оценке в контексте оператора if принуждается к Boolean, а поскольку Boolean({}) оценивается как true вы получите if (true). Это описано в спецификации ECMAScript, раздел 12.5. Заявление if:

Производственный оператор If: if (выражение) вычисляется следующим образом:

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

alert({} == true)false

Это сложнее. Из ECMAScript, раздел 11.9.3 The Abstract:

Сравнение x == y, где x и y - значения, выдает true или false. Такое сравнение выполняется следующим образом:

Если тип (y) является логическим, верните результат сравнения x == ToNumber (y).

Таким образом, {} == true будет оцениваться как {} == Number(true), который оценивается как {} == 1, который false.

Вот почему 1 == true оценивается как true, но 2 == true оценивается как false.


{} не true, поэтому он не будет отображаться в вашем первом примере. В вашем втором примере {} не является ложным, поэтому он пройдет тест.

Как мой учитель говорил, вы не можете сравнивать картофель и морковь.

Он не только с массивами, он будет работать с чем угодно:

alert(3 == true); // shows false
if (3) alert('true'); // shows true


В булевых операциях обычно ничего, кроме 0, не соответствует true. http://jsfiddle.net/QF8GW/

if (0) console.log("0 shows true"); // does not log a value
if (-1) console.log("-1 shows true");
if (12345) console.log("12345 shows true");
if ({}) console.log("{} shows true");
if ([]) console.log("[] shows true");

Все из них, кроме 0, будут оцениваться как true.

Однако их значения по сравнению с true не будут оцениваться с помощью true.

// logs the statement (1 and true are the same.)
​if (1 == true) console.log("1==true shows true");​​​​​​​​
if (12345 == true) console.log("12345==true shows true"); // does not log


alert({} == true) //display "false"
if({} == true)
{
 alert("it true");
}else
{
 alert("it false"); // <-- alert this
}

(фрагмент)


Я попытался в jsfiddle.net, и только в первом предупреждении указано false, IF не сообщает об ошибке.

licensed under cc by-sa 3.0 with attribution.