- Почему
NaN === false
= > false, не является ложным NaN? - Почему
NaN === NaN
= > false, но!!NaN === !!NaN
= > true
Я изо всех сил пытаюсь понять это.
NaN === false
= > false, не является ложным NaN?NaN === NaN
= > false, но !!NaN === !!NaN
= > trueЯ изо всех сил пытаюсь понять это.
false
- это разные вещи, поэтому для y
вместо e
.;)NaN
никогда не будет равным никому. Вторая часть вашего вопроса - это сравнение false === false
, которое достаточно забавно, true
:)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
Это условие:
NaN === false
Всегда false
, потому что числа не являются булевыми. Чтобы проверить, является ли значение ложным, вы можете использовать трехмерное выражение:
NaN ? "truthy" : "falsy" // falsy
Почему NaN === NaN = > false
Это объясняется в MDN; прагматично говоря, однако, два значения, о которых вы только знаете, это не цифры, не могут логически быть одним и тем же.
... но почему? NaN ===!! NaN = > true
Это связано с тем, что приведение NaN
в логическое значение сделает его false
, а логическое значение можно сравнить по нормали.
===
сравнивает как тип, так и значение.
Даже если 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
.
- Почему 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
NaN и false - оба подмножества Falsy.