Null, ноль и Undefined: разбираемся в сортах пустоты

Null, ноль и Undefined: разбираемся в сортах пустоты

Скоро это будет очень полезный навык

Иногда в коде можно встретить что-то вроде такого:

if (counter == null)	{
		//какой-то код
}

Может показаться, что null — это название переменной, но на самом деле это специальное значение, которое означает, что переменная есть, но в переменной ничего нет. Кроме этого, есть ещё одно интересное состояние переменной — undefined, которое означает, что переменная не определена. Давайте разберёмся, в чём разница и для чего это всё нужно.

Минутка информатики. Если копать совсем глубоко, то в переменной не всегда лежат именно те данные, которые мы туда отправили. 

Чаще всего при объявлении переменной компьютер выделяет сколько-то байтов в памяти, в которые можно записать любое помещающееся значение. Но это работает только для простых переменных — чисел и символов (которые внутри тоже числа). Если нам нужна строка, которая состоит из множества символов, или массив, то в переменной хранится не значение, а только ссылка на область памяти, в которой лежат наши данные. В этих случаях переменная — это карта, которая объяснит компьютеру, где найти всё остальное.

Зная это, будет проще разобраться, почему компьютер иногда вместо конкретного значения переменной записывает в неё null или undefined.

Что такое undefined

Когда мы только создаём переменную без явного указания типа и ничего в неё не кладём, то компьютер многого не знает:

  • он не знает, что в ней может оказаться;
  • не в курсе, сколько памяти надо будет выделить; 
  • не понимает, по каким правилам с этой переменной нужно работать дальше.

Чтобы пометить себе, что пока ничего не ясно, компьютер помечает эту переменную как undefined, что означает «неопределённость»:

Null, ноль и Undefined: разбираемся в сортах пустоты
Код на JavaScript

В тех языках, где переменные не обязательно объявлять заранее, например в Python, интерпретатор тоже выведет подобное сообщение. Отличие будет в том, что здесь это приведёт к ошибке, так как компьютер даже не знает, что у него есть такая переменная.

Представьте, что вы занимаетесь уборкой и вам говорят: «Возьми мешок». Что это значит? Пока неясно: это мешок для мусора или вещей; какого объёма; полный или пустой. Просто «мешок». Если представить, что мешок — это переменная, то undefined мешок — это как раз «просто некий мешок, без уточнения».

Чаще всего в языках с сильной динамической типизацией у переменной не может быть значения undefined, потому что переменная в них появляется в момент её объявления и присваивания сразу какого-то значения. Но само понятие undefined тоже там используется — оно означает, что компьютер вообще ничего не знает про эту переменную.

Зачем нужен undefined

Чаще всего это используется для проверки состояния переменной — есть ли в ней хоть что-то. Например, если в ней что-то есть, то с этим можно работать дальше, а если нет — вывести сообщение о том, что переменная пустая. Это полезно для отладки кода или для проверки входящих в нашу программу данных и вывода информативных ошибок. 

Null, ноль и Undefined: разбираемся в сортах пустоты

Что такое null

В отличие от undefined, когда компьютер не знает, что лежит в переменной, null — это как раз одно из значений переменной. Оно означает, что переменная — пустая, при этом компьютер точно знает, как с ней можно работать.

Допустим, мы хотим обратиться к элементу на странице по его id. Для этого мы сначала заводим переменную element, и на старте она будет определяться как undefined. После этого мы присваиваем этой переменной ссылку на нужный элемент, но если этого элемента на странице нет, то произойдёт такое:

  1. Скрипт попытается найти элемент на странице.
  2. После того как он убедится, что элемента нет, он вернёт null — это значит, что на странице ничего такого нет.
  3. Это значение null отправится в переменную element, и у неё появится определённое значение null.

Если вспомнить наш мешок во время уборки:

undefined — это когда вы ничего не знаете про мешок — даже то, есть ли этот мешок в принципе или его нужно пойти и где-то купить;

null — это когда вы знаете, что мешок есть, он определённого размера и формы, но он точно пустой и даже ещё не раскрытый;

Null, ноль и Undefined: разбираемся в сортах пустоты

В некоторых языках, например Python, вместо null используют None — это тоже значение переменной, которое означает, что в переменной ничего нет, но сама переменная определена верно.

Undefined и null — это одно и то же?

Нет, и в этом легко убедиться, используя строгое сравнение. Дело в том, что при обычном сравнении компьютер смотрит, есть что-то в переменной или нет, при этом ему неважно, работали мы с ней раньше или нет. А при строгом сравнении компьютер смотрит ещё и на тип данных — в этом случае сразу видно, что у undefined никакого типа данных нет:

Null, ноль и Undefined: разбираемся в сортах пустоты

А что такое ноль?

А ноль — это самая «жирная» пустота из всех вышеперечисленных. Ноль — это полноценное значение численной переменной (например, integer, то есть целого числа). 

Представьте, что вы пишете программу, которая обрабатывает прогнозы погоды. Эти данные она получает с погодного сервера. И с этого сервера прилетала переменная temperature. Сравните:

Если temperature === undefined, то, похоже, с сервера не прилетело никакой переменной с температурой. Программа завела переменную для приёма данных, но дальше ничего не произошло. Мы даже не знаем, какого типа данные нам прилетят. А то и вовсе нет никакой переменной.

Если temperature === null, то мы знаем, в каком формате прилетит температура, но сами данные ещё не прилетели.

Если temperature === 0, то температура — ноль градусов (предположим, по Цельсию). Ноль градусов — это вполне себе значение, с которым можно работать — например нарисовать снежинку.

Возвращаясь к метафоре с мешком: ноль — это когда нам объяснили, какой именно нужен мешок, мы его взяли и запихнули в него ноль, который занял всё место. Зачем? Видимо, так надо. 

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Виталий Вебер

Читаете «Код»? Зарабатывайте на коде
Сфера ИТ и разработки постоянно растёт и требует новых кадров. Компании готовы щедро платить даже начинающим разработчикам, а опытных вообще отрывают с руками. Обучиться на разработчика можно в «Яндекс Практикуме».
Начать карьеру
Читаете «Код»? Зарабатывайте на коде Читаете «Код»? Зарабатывайте на коде Читаете «Код»? Зарабатывайте на коде Читаете «Код»? Зарабатывайте на коде
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
Что такое куки

8 вопросов, которые вы всегда хотели задать, но боялись куки.

easy
Как работают алгоритмы кодирования в радиосвязи
Как работают алгоритмы кодирования в радиосвязи

Как вообще это возможно — что по воздуху к нам прилетает видео?

medium
«Мы слышим, как вы дышите»: как компании следят за своими клиентами
«Мы слышим, как вы дышите»: как компании следят за своими клиентами

Конспект подкаста «Запуск завтра»

easy
Двоичное счисление на пальцах

Все знают, что компьютеры состоят из единиц и нулей. Но что это значит на самом деле?

easy
«Никто не верил, что я сама пишу код»

Анастасия Никулина: о дата-сайнс, ютубе и программировании.

easy
С чего начать в IT

Даже если вы абсолютный гуманитарий — выход есть.

easy
4 виртуальные машины на любой случай
4 виртуальные машины на любой случай

Машин нет, но они как бы есть

medium
Scala
Зачем нужен Scala?

Разбираем, почему это не самый популярный язык.

easy
Симметричное шифрование
Симметричное шифрование

Простое, но очень стойкое.

medium
Настраиваем сервер для своего облачного хранилища
Настраиваем сервер для своего облачного хранилища

Готовимся к переезду в личное облако

hard
easy