Почему "undefined равно false" возвращает false?

Когда я сравниваю undefined и null от Boolean false, оператор возвращает false:

undefined == false;
null == false;

Он возвращает false. Почему?

Ответ 1

С исходным ответом, указывающим на удаляемую спецификацию, я хотел бы предоставить ссылку и краткую выдержку из спецификации здесь.

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

В спецификаторе ECMA указывается причина, по которой undefined == false возвращает значение false. Хотя он прямо не говорит, почему это так, самая важная часть ответа на этот вопрос заключается в этом предложении:

The comparison x == y, where x and y are values, produces true or false.

Если мы посмотрим на определение null, мы найдем что-то вроде этого:

NULL or nil means "no value" or "not applicable".

В Javascript undefined обрабатывается одинаково. Это не имеет никакого значения. Однако значение false имеет значение. Это говорит нам, что что-то не так. В то время как undefined и null не должны давать нам никакой ценности. Точно так же нет ничего, что можно было бы преобразовать в его абстрактное сравнение равенства, поэтому результат всегда был бы ложным. Именно поэтому null == undefined возвращает true (они оба без какого-либо значения). Следует отметить, что null === undefined возвращает false из-за их разных типов. (Используйте typeof(null) и typeof(undefined) в консоли, чтобы проверить его)

Мне любопытно, что сравнение NaN с чем-либо вообще будет всегда возвращать false. Даже при сравнении с самим собой. [ NaN == NaN возвращает false]


Строгое равенство

Если возможно, вам следует избегать использования оператора == для сравнения двух значений. Вместо этого используйте ===, чтобы убедиться, что два значения равны друг другу. == дает иллюзию, что два значения действительно точно равны, если они не могут быть использованы при принуждении. Примеры:

5 == "5" истинно

5 === "5" false

"" == false истинно

"" === false false

0 == false истинно

0 === false false

Ответ 3

Из несравненного MDN, спонсируемого компанией создателя JavaScript.

JavaScript предоставляет три различные операции сравнения значений:

  • строгое равенство (или "тройное равенство" или "идентичность" ) с использованием ===,
  • свободное равенство ( "double equals" ) с использованием ==,
  • и Object.is(новый в ECMAScript > 6).

Выбор того, какую операцию использовать, зависит от того, какой тип которое вы хотите выполнить.

Вкратце, double equals будут выполнять преобразование типа при сравнении две вещи; тройка равна будет делать то же сравнение без преобразования типа (просто всегда возврат false, если типы отличаются); и Object.is будут вести себя так же, как и тройной, но с особой обработкой для NaN и -0 и +0, так что последние два не считаются одинаковыми, тогда как Object.is(NaN, NaN) будет истинным. (Сравнение NaN с NaN обычно - то есть, используя либо двойные равные, либо тройные равные оценки на false, потому что IEEE 754 так говорит.) Обратите внимание, что различие между ними все связано с их обработкой примитивов; никто из них сравнивают, концептуально ли параметры в состав. Для любых не примитивных объектов x и y, которые имеют одинаковые структуры, но являются отдельными объектами, все указанные формы будет оцениваться как false.

Для визуального обзора всей картины равенства в JavaScript: https://dorey.github.io/JavaScript-Equality-Table/

По правде говоря, этот, казалось бы, "плохой" аспект JavaScript является источником власти, когда вы понимаете, как это работает.

Ответ 4

Значит undefined означает undefined. Не False, не True, а не 0, а не пустая строка. Поэтому, когда вы сравниваете undefined с чем угодно, результат всегда false, он не равен этому.

Ответ 5

Undefined не может = false, потому что он не был определен, чтобы он не знал, делает он это или нет

По-английски это было бы как сказать Аноним = Фред или Аноним!= Фред.

Это может быть Фред, это может быть Билл, но на данный момент у нас нет подсказки.

Аналогичное правило для Null. Это немного больно, чтобы сначала направить голову, но это очень ценное правило, без всякой двусмысленности в ваших замыслах.

Например, как определить разницу между тем, что не было введено (null) или пустое.

Ответ 6

В соответствии со спецификацией, упомянутой выше:

Если тип (y) булев, верните результат сравнения x == ToNumber (у).

Number(undefined) = NaN;

false == NaN // false

Более того, если мы изменим порядок false == undefined

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

Number(false) = 0;
0 == undefined

В этом случае нет правила, поэтому работайте по умолчанию:

Возвращает false.

Ответ 7

Undefined - это не то же самое, что и false, false - это логический объект (который имеет значение 0, поэтому он действительно определен).

Пример:

var my_var;
var defined = (my_var === undefined)
alert(defined);  //prints true.  It is true that my_var is undefined

my_var = 22;
defined = (my_var === undefined)
alert(defined);  //prints false.  my_var is now defined

defined = (false === undefined)
alert(defined);  //prints false, false is defined

defined = (true === undefined)
alert(defined);  //prints false, true is defined