Прежде всего хочу отметить, что я умею isNaN()
и Number.isNaN()
работаю. Я читаю «Определенное руководство » Дэвида Фланагана, и он приводит пример того, как проверить, является ли значение NaN
:
x !== x
Это приведет к тому, true
если и только если x
есть NaN
.
Но теперь у меня вопрос: почему он использует строгое сравнение? Потому что кажется, что
x != x
ведет себя так же. Безопасно ли использовать обе версии, или мне не хватает некоторых значений в JavaScript, которые будут возвращаться true
для x !== x
и false
для x != x
?
javascript
nan
Георгий Накери
источник
источник
!==
чеки более!=
чеков. Насколько я знаю, нет другой ценности, гдеx != x
. Но есть две разные группы разработчиков JavaScript: те, кто предпочитает,!=
и те, кто предпочитает!==
, будь то скорость, ясность, выразительность и т. Д.NaN
это не уникальный тип, это число. Это уникальная ценность, которая не равна себе.===
с NaN, чтобы подчеркнуть, что NaN не равен самому себе. Он не «неправ», он делает это как учебное упражнение, демонстрируя, что это не работает.Ответы:
Во-первых, позвольте мне отметить, что
NaN
это особая ценность: по определению она не равна самой себе. Это происходит из стандарта IEEE-754, на котором основаны числа JavaScript. Значение «не число» никогда не равно само себе, даже если биты точно совпадают. (В IEEE-754 они не обязательно, он допускает несколько разных значений «не число».) Вот почему это даже подходит; все остальные значения в JavaScript равны сами по себе,NaN
просто особенные.Нет, ты не Единственная разница между
!==
и!=
заключается в том, что последний будет выполнять приведение типов в случае необходимости, чтобы типы операндов были одинаковыми. Вx != x
, типы операндов одинаковы, и поэтому он точно так же, какx !== x
.Это ясно с самого начала определения операции абстрактного равенства :
Первые два шага - это базовая сантехника. Таким образом, на самом деле, самый первый шаг в
==
том, чтобы увидеть, являются ли типы одинаковыми и, если да, сделать===
вместо этого.!=
и!==
просто отрицаемые версии этого.Так что, если Фланаган прав, что только
NaN
даст правдуx !== x
, мы можем быть уверены, что это также верно, что толькоNaN
даст правдуx != x
.Многие программисты на JavaScript по умолчанию используют
===
и!==
избегают некоторых ловушек вокруг приведения типов, которые делают свободные операторы, но в этом случае нечего читать при использовании Фланаганом оператора строгого и свободного.источник
4.9.1 - Equality and Inequality Operators
раздел, и это, кажется, ответ. Ключевой момент для===
сравнения:If the two values have the same type, test them for strict equality as described above. If they are strictly equal, they are equal. If they are not strictly equal, they are not equal
.a
на самом деле функция и не возвращает одно и то же значение дважды? Это не то же самое, что значение, для которого!==
было бы верно, о чем спрашивал ОП. Это просто функция, которая возвращает разные значения.foo() !== foo()
не обязательно также верно, так какfoo
может возвращать разные значения при каждом вызове.Для целей NaN
!=
и!==
сделать то же самое.Однако многие программисты избегают
==
или используют!=
JavaScript. Например, Дуглас Крокфорд считает их « плохими частями » языка JavaScript, потому что они ведут себя неожиданным и запутанным образом:источник
Просто для удовольствия, позвольте мне показать вам искусственный пример, где
x
нет,NaN
но операторы в любом случае ведут себя по-разному. Сначала определите:Тогда у нас есть
но
источник
foo() != foo()
когда foo возвращает 1, а затем 2. Например, значения не совпадают, просто сравниваются разные значения.Я просто хочу отметить, что
NaN
это не единственное, что производитx !== x
без использования глобального объекта. Есть много умных способов вызвать это поведение. Вот один, использующий геттеры:Как указывают другие ответы,
==
выполняет приведение типов, но, как и в других языках и в соответствии со стандартом, NaN указывает на сбой вычислений, и по понятным причинам он не равен самому себе.По какой-то причине, кроме меня, люди считают, что это проблема с JS, но большинство языков с двойными значениями (а именно, C, Java, C ++, C #, Python и другие) демонстрируют это точное поведение, и люди просто в порядке.
источник
Поскольку иногда изображения лучше, чем слова, проверьте эту таблицу (поэтому я хочу сделать это ответом вместо комментария, потому что он лучше виден).
Там вы можете увидеть, что строгое сравнение равенства (===) возвращает true только если тип и содержимое совпадают, поэтому
В то время как сравнение абстрактного равенства (==) проверяет только содержимое *, преобразовывая типы и затем строго сравнивая их:
Хотя не понятно, без консультации с ECMA , что учитывает JavaScript при сравнении, таким образом, что код ниже оценивает как true.
источник