Во-первых, позвольте мне отметить, что NaN
это особая ценность: по определению она не равна самой себе. Это происходит из стандарта IEEE-754, на котором основаны числа JavaScript. Значение «не число» никогда не равно само себе, даже если биты точно совпадают. (В IEEE-754 они не обязательно, он допускает несколько разных значений «не число».) Вот почему это даже подходит; все остальные значения в JavaScript равны сами по себе, NaN
просто особенные.
... мне не хватает некоторого значения в JavaScript, которое будет возвращать true для x! == x и false для x! = x?
Нет, ты не Единственная разница между !==
и !=
заключается в том, что последний будет выполнять приведение типов в случае необходимости, чтобы типы операндов были одинаковыми. В x != x
, типы операндов одинаковы, и поэтому он точно так же, как x !== x
.
Это ясно с самого начала определения операции абстрактного равенства :
- ReturnIfAbrupt (х).
- ReturnIfAbrupt (у).
Если тип (х) совпадает с типом (у), то
Вернуть результат выполнения Строгое Сравнения Равенства x === y.
...
Первые два шага - это базовая сантехника. Таким образом, на самом деле, самый первый шаг в ==
том, чтобы увидеть, являются ли типы одинаковыми и, если да, сделать ===
вместо этого. !=
и !==
просто отрицаемые версии этого.
Так что, если Фланаган прав, что только NaN
даст правду x !== x
, мы можем быть уверены, что это также верно, что только NaN
даст правду x != x
.
Многие программисты на JavaScript по умолчанию используют ===
и !==
избегают некоторых ловушек вокруг приведения типов, которые делают свободные операторы, но в этом случае нечего читать при использовании Фланаганом оператора строгого и свободного.
!==
чеки более!=
чеков. Насколько я знаю, нет другой ценности, гдеx != x
. Но есть две разные группы разработчиков JavaScript: те, кто предпочитает,!=
и те, кто предпочитает!==
, будь то скорость, ясность, выразительность и т. Д.