По-перше, дозвольте зазначити, що NaN
це дуже особливе значення: За визначенням, воно не рівне собі. Це походить від стандарту IEEE-754, на якому позначаються номери JavaScript. Значення "не число" ніколи не дорівнює собі, навіть коли біти точно збігаються. (Що вони необов’язково в IEEE-754, це дозволяє кілька різних значень "не число".) Тому це навіть з'являється; всі інші значення в JavaScript рівні собі, NaN
просто особливі.
... я пропускаю якесь значення в JavaScript, яке поверне справжнє для x! == x та false для x! = x?
Ні, не ти. Єдина відмінність між !==
і !=
полягає в тому, що останні будуть виконувати примус, якщо необхідно, щоб типи операндів були однаковими. У x != x
, типи операндів однакові, і тому вони точно такі ж, як x !== x
.
Це зрозуміло з початку визначення операції "Абстракційна рівність" :
- ReturnIfAbrupt (x).
- ReturnIfAbrupt (y).
Якщо Type (x) такий же, як Type (y), то
Поверніть результат виконання суворого порівняння рівності x === y.
...
Перші два кроки - це основна сантехніка. Таким чином, насправді перший крок - ==
це зрозуміти, чи типи однакові, і, якщо так, зробити це ===
замість цього. !=
і !==
це лише заперечені версії цього.
Тож якщо Фланаган правильний, що відповідає лише NaN
істині x !== x
, ми можемо бути впевнені, що це також правда, що тільки NaN
дасть істину для x != x
.
Багато програмістів JavaScript за замовчуванням використовують ===
та !==
уникають деяких підводних каменів навколо примусу типу, який виконують вільні оператори, але в цьому випадку використання Фланагана оператора суворого та вільного в цьому випадку нічого не можна прочитати.
!==
чекам над!=
чеками. Наскільки я знаю, немає іншого значення деx != x
. Але є дві окремі групи розробників JavaScript: ті, хто віддає перевагу,!=
і ті, хто вважає за краще!==
, будь то швидкість, ясність, виразність тощо