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