На это сайт пока нет времени. Хочу когда-нибудь переделать.

NaN, null и undefined как разновидности небытия в JavaScript

Это писалось 3 года назад, надо бы переосмыслить этот материал

 

За свою жизнь я познакомился с несколькими языками программирования, но всего один из них никогда не перестанет меня поражать и возмущать — это JavaScript.

В юности мне доставило удовольствие прочтение книги Жульева «Пролог к естествознанию» и там была следующая цитата:

Кроме Бытия ничего не может быть, так как всё другое – небытие.

©Жульев В.К.

Цитата ясно даёт понять что небытия нет, и это забавно ведь документация по JS частенько заставляет меня усомниться в этом. 


Итак, согласно документации в JavaScript есть 6 типов данных:

  • Число «number»
  • Строка «string»
  • Булевый (логический) тип «boolean»
  • Специальное значение «null»
  • Специальное значение «undefined»
  • Объекты «object».

Из этих типов данных null и undefined равны друг другу, что само по себе довольно странно.

null == undefined; //true
undefined === null; //false

Точнее было сказать, которые равны и не равны друг другу. Не вполне понятно, зачем необходимо было создавать два типа данных? Впрочем, об этом есть прекрасные статьи Ryan Morr и Александра Субботина. На мой взгляд, авторы языка чересчур намудрили с типами, но ничего исправить не могут т.к. уже существует множество библиотек, которые зависят от подобных казусов.

Помимо null и undefined существует ещё NaN. NaN — это некое не совсем число, типа Number. Его можно получить умножив null и undefined, также если одно из чисел было не определено. Этот казус является подводным камнем или неким айсбергом, с которым приходится взаимодействовать при разработке. NaN, как бы говорит нам «Такого значения быть не может, я тоже не значение, но мне не стоит верить т.к. в самоидентификации я не силён!». Ещё одной важной особенностью является прожорливость NaN, т.к. стоит NaN оказаться среди чисел, всё становится им. В этом отношении NaN можно сравнить с чёрной дырой или смертью.

null/undefined; //NaN
var a = undefined;
var b = null;
var c = 7;
a+c;//NaN 
a+b;//7

Не стоит забывать и о бесконечности(Infinity) которая может быть отрицательной и положительной. К ней у NaN «положительное» отношение т.к. не зависимо от убывания и возрастания NaN настолько крут, что способен положить даже на неё.

Infinity - Infinity; //NaN
Infinity + NaN; //NaN
var Infinity; //undefined
typeof(Infinity); // "number"

Исходя из вышесказанного хотелось бы подвести к логическому завершению.

Итог

Даже в JS, несмотря на не поддающиеся логике особенности синтаксиса, небытия всё таки нет. Ведь Null, не столько недообъект, сколько число которое существует и равно нулю. NaN является некой смертью с косой, и косит всех отднотипников. Undefined же представляет некую неопределённость, как бы указывая на то, что язык не в курсе того, о чём идёт речь, возможно именно он в большей степени похож на небытие.  
В любом случае, лично для меня, JavaScript остаётся поистине таинственным и загадочным языком, понимание которого как и ответ на вопрос «Wtf?», пока ещё находится в небытии.