Почему "неопределенное равно ложному" возвращает ложное?
Когда я сравниваю undefined и null с логическим значением false, инструкция возвращает false:
undefined == false;
null == false;
Вернуть ложь. Зачем?
8 ответов
Исходный ответ, указывающий на удаляемую спецификацию, я хотел бы предоставить здесь ссылку и краткий отрывок из спецификации.
http://www.ecma-international.org/ecma-262/5.1/
В спецификации ECMA указана причина, по которой undefined == false
возвращает ложь Хотя в нем прямо не говорится, почему это так, наиболее важная часть ответа на этот вопрос заключается в следующем предложении:
Сравнение x == y, где x и y - значения, дает истину или ложь.
Если мы посмотрим на определение для нуля, мы найдем что-то вроде этого:
NULL или ноль означает "нет значения" или "не применимо".
В Javascript, undefined
рассматривается так же. Это без какой-либо ценности. Однако false имеет значение. Это говорит нам, что что-то не так. В то время как undefined
а также null
не должны давать нам никакой ценности. Кроме того, нет ничего, что он может преобразовать для сравнения абстрактного равенства, поэтому результат всегда будет ложным. Это также почему null == undefined
возвращает true (они оба не имеют никакого значения). Следует отметить, что null === undefined
возвращает false из-за их разных типов. (Использование typeof(null)
а также typeof(undefined)
в консоли, чтобы проверить это)
Что меня интересует, так это сравнение NaN
с чем-либо вообще всегда вернет false. Даже если сравнивать это с собой. [NaN == NaN
возвращает ложь]
Кроме того, еще одна странная информация: [typeof NaN
возвращает "число"]
Строгое Равенство
Если возможно, вам следует избегать использования оператора == для сравнения двух значений. Вместо этого используйте ===, чтобы действительно увидеть, равны ли два значения друг другу. == создает иллюзию того, что два значения действительно равны, когда они могут не совпадать при использовании принуждения. Примеры:
5 == "5"
правда
5 === "5"
ложно
"" == false
правда
"" === false
ложно
0 == false
правда
0 === false
ложно
Из несравненной MDN, спонсируемой компанией создателя JavaScript.
JavaScript предоставляет три различные операции сравнения значений:
- строгое равенство (или "тройное равенство" или "идентичность") с использованием ===,
- слабое равенство ("двойное равенство") с использованием ==,
- и Object.is (новое в ECMAScript > 6).
Выбор используемой операции зависит от того, какое сравнение вы хотите выполнить.
Вкратце, двойное равенство будет выполнять преобразование типов при сравнении двух вещей; тройное равенство будет делать то же самое сравнение без преобразования типов (просто всегда возвращая false, если типы различаются); и Object.is будет вести себя так же, как тройное равенство, но со специальной обработкой для NaN и -0 и +0, так что последние два не будут совпадать, а Object.is(NaN, NaN) будет истинным, (Сравнение NaN с NaN обычно - то есть с использованием либо двойных равных, либо тройных равных - дает ложное значение, потому что IEEE 754 говорит об этом.) Обратите внимание, что различие между ними связано с обработкой примитивов; Ни один из них не сравнивает, являются ли параметры концептуально схожими по структуре. Для любых не примитивных объектов x и y, которые имеют одинаковую структуру, но сами являются различными объектами, все вышеперечисленные формы будут иметь значение false.
Для визуального обзора всей картины равенства в JavaScript: https://dorey.github.io/JavaScript-Equality-Table/
Правда в том, что этот, казалось бы, "плохой" аспект JavaScript является источником силы, когда вы понимаете, как он работает.
Это так, потому что это так.:)
Прочитайте стандарты ECMA здесь: https://www.ecma-international.org/ecma-262/5.1/
Так что undefined на самом деле означает неопределенное. Не False, не True, не 0, не пустая строка. Поэтому, когда вы сравниваете неопределенное с чем-либо, результат всегда ложный, он не равен этому.
Согласно спецификации, которая была упомянута выше:
Если Type (y) - Boolean, вернуть результат сравнения x == ToNumber (y).
Number(undefined) = NaN;
false == NaN // false
Более того, если мы изменим порядок false == undefined
Если Type (x) - Boolean, вернуть результат сравнения ToNumber (x) == y.
Number(false) = 0;
0 == undefined
Для этого случая нет правила, поэтому работайте по умолчанию:
Вернуть ложь.
Неопределенный не может = ложь, потому что он не был определен, поэтому неизвестно, делает это или нет
По-английски это все равно что сказать Anonymous = Fred или Anonymous!= Fred.
Это может быть Фред, это может быть Билл, но на данный момент мы понятия не имеем.
Аналогичное правило для Null. Поначалу немного обидно, но это очень ценное правило, без которого всякие двусмысленности могут проникнуть в ваши замыслы.
Например, как определить разницу между чем-то, что не было введено (пусто) или пустым.
Ваш вопрос наполовину, так как мы сравниваем undefined/ null с любыми другими типами. у нас будет ложное возвращение. Принуждения не происходит, даже мы используем оператор ==.
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