По-перше, дозвольте зазначити, що 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: ті, хто віддає перевагу,!=і ті, хто вважає за краще!==, будь то швидкість, ясність, виразність тощо