Краще назва NaN
, яке б точніше і менш заплутано описувало його значення, було б числовим винятком . Це справді інший вид об’єкта винятку, замаскований як примітивний тип (за мовною конструкцією), де при цьому він не трактується як примітивний у своєму помилковому самопорівнянні. Звідси плутанина. І поки мова "не подумає" вибирати між правильним об'єктом виключення та примітивним числом , плутанина залишатиметься.
Сумнівна нерівність самого NaN
себе і того, ==
і іншого, ===
є проявом заплутаного дизайну, що змушує цей об'єкт винятку бути примітивним. Це порушує основний принцип того, що примітив однозначно визначається його цінністю . Якщо NaN
перевагу слід розглядати як виняток (серед яких можуть бути різні види), то це не повинно «продаватися» як примітивне. І якщо він хоче бути примітивним, цей принцип повинен дотримуватися. Поки він порушений, як у нас в JavaScript, і ми не можемо реально вирішити між ними, збережеться плутанина, що призводить до зайвого когнітивного навантаження для всіх учасників. Що, однак, реально легко виправити, просто зробивши вибір між двома:
- або зробити
NaN
спеціальний об’єкт винятку, що містить корисну інформацію про те, як виняток виник, на відміну від викидання цієї інформації як тієї, що реалізується в даний час, що призводить до більш важкого коду налагодження;
- або створити
NaN
сутність примітивного типу number
(яку можна менш заплутано назвати "числовою"), і в цьому випадку вона повинна бути рівною собі і не може містити іншої інформації; останній явно є неповноцінним вибором.
Єдиною можливою перевагою примушування NaN
до number
типу є можливість повернути його в будь-який числовий вираз. Це, однак, робить її крихким вибором, оскільки результат будь-якого числового вираження, що містить, NaN
буде або матиме NaN
, або призводить до непередбачуваних результатів, таких як NaN < 0
оцінювання false
, тобто повернення boolean
замість збереження виключення.
І навіть якщо "речі є такими, якими вони є", ніщо не заважає нам зробити це чітке розмежування для себе, щоб зробити наш код більш передбачуваним і простішим налагодження. На практиці це означає ідентифікацію цих винятків та поводження з ними як винятки. Це, на жаль, означає більше коду, але, сподіваємось, буде пом'якшено такими інструментами, як TypeScript Flowtype.
І тоді ми маємо безладний тихий і шумний ака, що сигналізує про NaN
відмінність . Що насправді стосується того, як обробляються винятки, а не самі винятки, і нічим не відрізняються від інших винятків.
Так само є Infinity
і +Infinity
елементами числового типу, що виникають при розширенні дійсної лінії, але вони не є реальними числами. Математично вони можуть бути представлені послідовностями дійсних чисел, що сходяться на +
або -Infinity
.