Когда я сравниваю undefined и null от Boolean false, оператор возвращает false:
undefined == false;
null == false;
Он возвращает false. Почему?
Когда я сравниваю undefined и null от Boolean false, оператор возвращает false:
undefined == false;
null == false;
Он возвращает false. Почему?
С исходным ответом, указывающим на удаляемую спецификацию, я хотел бы предоставить ссылку и краткую выдержку из спецификации здесь.
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
это так, потому что это так:)
читайте стандарты ECMA здесь: http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3
PS: Я использую этот сайт, но официальный http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.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 является источником власти, когда вы понимаете, как это работает.
Значит undefined означает undefined. Не False, не True, а не 0, а не пустая строка. Поэтому, когда вы сравниваете undefined с чем угодно, результат всегда false, он не равен этому.
Undefined не может = false, потому что он не был определен, чтобы он не знал, делает он это или нет
По-английски это было бы как сказать Аноним = Фред или Аноним!= Фред.
Это может быть Фред, это может быть Билл, но на данный момент у нас нет подсказки.
Аналогичное правило для Null. Это немного больно, чтобы сначала направить голову, но это очень ценное правило, без всякой двусмысленности в ваших замыслах.
Например, как определить разницу между тем, что не было введено (null) или пустое.
В соответствии со спецификацией, упомянутой выше:
Если тип (y) булев, верните результат сравнения x == ToNumber (у).
Number(undefined) = NaN;
false == NaN // false
Более того, если мы изменим порядок false == undefined
Если Type (x) является логическим, верните результат сравнения ToNumber (x) == y.
Number(false) = 0;
0 == undefined
В этом случае нет правила, поэтому работайте по умолчанию:
Возвращает false.
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