Является ли NaN ложным? Почему NaN === false возвращает false

  • Почему NaN === false = > false, не является ложным NaN?
  • Почему NaN === NaN = > false, но !!NaN === !!NaN = > true

Я изо всех сил пытаюсь понять это.

Ответ 1

  • Фальши и строго равные false - это разные вещи, поэтому для y вместо e.;)
  • NaN никогда не будет равным никому. Вторая часть вашего вопроса - это сравнение false === false, которое достаточно забавно, true:)

Ответ 2

1.Why NaN === false = > false, не NaN-фальшивка?

Термин "ложь" не определен в ECMA-262, это жаргон, где преобразование типов приводит к значению false. например.

var x = NaN;

if (!x) {
  console.log('x is "falsy"');
}

Строгий оператор равенства использует Алгоритм сравнения строгих равенств, который проверяет, что аргументы одного типа, а NaN - это номер типа, а false - тип boolean, поэтому они оцениваются как не равные по типу, сравнение не сравнивается.

2.Why NaN === NaN = > false, но!! NaN ===!! NaN = > true

Поскольку в строгом алгоритме сравнения равенства указано, что NaN !== NaN, следовательно, метод isNaN.

Использование! принуждает аргумент к логическому использованию с использованием абстрактного метода ToBoolean, где !NaN преобразует в true и !!NaN преобразует в false, поэтому:

!!NaN === !!NaN  -->  false === false  -->  true

Обратите внимание, что абстрактный оператор равенства == будет принуждать аргументы к одному типу в соответствии с правилами для Алгоритм сравнения абстрактного равенства. В этом случае NaN является номером типа, поэтому значение false преобразуется в число, используя toNumber, который возвращает 0. И 0 не равен NaN, поэтому:

NaN == false  -->  NaN == 0  -->  false

Ответ 3

Это условие:

NaN === false

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

NaN ? "truthy" : "falsy" // falsy

Почему NaN === NaN = > false

Это объясняется в MDN; прагматично говоря, однако, два значения, о которых вы только знаете, это не цифры, не могут логически быть одним и тем же.

... но почему? NaN ===!! NaN = > true

Это связано с тем, что приведение NaN в логическое значение сделает его false, а логическое значение можно сравнить по нормали.

Ответ 4

=== сравнивает как тип, так и значение.

Даже если NaN является ложным, === не может сравниться. Что-то "ложно", если оно вычисляет false в булевом выражении. Это не то же самое, что оно равно (или эквивалентно) false.

Например, null == false возвращает false, даже если null false. Это не совсем интуитивно понятно, но именно то, как JavaScript обрабатывает значения false/falsey.

0, а пустая строка ("") - это особые случаи, когда сравнение равенства значений с false оценивается до true (т.е. 0 == false и "" == false). Однако 0===false и ""===false все равно возвращает false.

NaN особенность в том, что он не имеет реального значения, поэтому сравнение его с самим собой не возвращает true. По существу, NaN равно ничему, даже не NaN.

Единственный способ достоверно сравнить что-то с NaN - это использовать isNaN( value ).


К вашему второму пункту !value - логическое выражение. value сначала подвергается принуждению типа к логическому (и помните, NaN false), а затем логическое NOT ! делает его истинным. Как бы то ни было, это двойное отрицание, поэтому !!NaN совпадает с boolean false. Конечно, false === false, поэтому выражение оценивается как true.

Ответ 5

  • Почему NaN === false = > false, не NaN-фальшивка?

NaN, поскольку вы используете глобальное свойство, инициализированное значение Not-A-Number. Это не логично. Он тип данных NaN, как определено в IEEE 754.

Это то же самое, что вы сравниваете null === false (или даже null == false).

В этом случае нет разницы при использовании sctric равным или нет: NaN == false, также вернет false!

  • Почему NaN === NaN = > false, но!! NaN ===!! NaN = > true

2.1. NaN ==== NaN, по определению является ложным.

2.2. Но в !!NaN === !!NaN вы больше не сравниваете NaN, когда вы выполняете ! [значение], вы "оцениваете" его (или отбрасываете boolean).

Теперь я объясню с помощью null, потому что он больше используется, поэтому вы можете применить его к NaN:

Кастинг NaN, это то же самое, что литье null.

null == false? true : false     // false! because it not a bool false.<br>
!null? true: false              // true! because !null -> true -> if(true)...

Дополнительные ссылки:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.1.1
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN

Ответ 6

NaN и false - оба подмножества Falsy.

  • NaN == false → они оба ложны → таким образом, "TRUE"
  • NaN === false → они НЕ того же типа → , таким образом, FALSE