Что такое null — и почему его автор назвал его ошибкой на миллиард долларов

В 2009 году на конференции в Лондоне учёный Тони Хоар вышел на сцену и извинился. За одну маленькую идею, которую он придумал в 1965-м, когда делал язык ALGOL W. Доклад назывался «Нулевые ссылки: ошибка на миллиард долларов».
Идея — это null. Значение, которое значит «ничего». С тех пор оно живёт почти в каждом языке и ломает программы каждый день. Скорее всего, и твою тоже — ты просто ещё не знал, как его зовут.
Что такое null
null — это намеренная пустота. Не ноль, не пустая строка, не ошибка. А честное «здесь ничего нет, и это нормально».
Представь анкету с полем «Отчество». У кого-то отчества нет. Оставить поле пустым — это не забыть его заполнить. Это ответ: «нет отчества». Вот это и есть null.
const user = {
name: "Аня",
middleName: null, // отчества нет — и мы это знаем
avatar: null // картинку ещё не загрузили
}
Разница с нулём важная. 0 — это число, количество. "" — это текст, просто пустой. А null — это отсутствие значения вообще. Корзина с нулём товаров — это 0. Корзины нет — это null.
null и undefined: два вида пустоты
В JavaScript пустота бывает двух сортов, и новички их путают постоянно.
undefined— «значение ещё не дали». Переменную объявили и не заполнили. Или спросили у объекта поле, которого у него нет. Это пустота по умолчанию, язык ставит её сам.null— «значение нарочно пустое». Его ставит человек (или код, который написал ИИ), когда хочет сказать: «проверил — ничего нет».
Простое правило: undefined — «забыли спросить», null — «спросили, ответ — ничего».
На практике их часто проверяют вместе, и это нормально. Одна деталь для будущих сюрпризов: typeof null в JavaScript возвращает "object". Это старая ошибка из самой первой версии языка, её так и не исправили — чтобы не сломать миллионы сайтов.
Откуда берётся «Cannot read properties of null»
Вот где null бьёт больнее всего. Самая частая ошибка в JavaScript выглядит так:
TypeError: Cannot read properties of null (reading 'name')
Переводится: «ты попросил поле name у пустоты». Код дошёл до user.name, а user оказался null. У пустоты нет полей. Программа падает.
Почему это случается постоянно? Потому что код от ИИ почти всегда пишется для счастливого случая: данные пришли, пользователь вошёл, картинка есть. А в жизни:
- пользователь ещё не вошёл —
userпокаnull; - элемент на странице не нашёлся —
document.querySelector(...)вернулnull; - в базе у записи пустое поле — прилетело
null.
Вот в чём было «на миллиард» у Хоара: любая переменная может оказаться пустой, но код этого не помнит. Каждая такая дыра — будущее падение.
Как не ловить эту ошибку
В современном JavaScript есть два маленьких оператора, которые решают большинство случаев. Увидишь их в коде от ИИ — теперь будешь знать, зачем они там.
?. — «если есть». Точка с вопросом останавливается на пустоте вместо падения:
user?.name // если user пустой — вернёт undefined, а не упадёт
?? — «а если пусто, то вот это». Подставляет запасное значение:
const name = user?.name ?? "Гость"
Строчка читается почти по-русски: «имя пользователя, если он есть, а иначе — Гость».
Главный совет не про синтаксис, а про промпт. Когда просишь ИИ сделать экран, добавь одну фразу: «учти, что пользователь может быть не залогинен, а данные — ещё не загружены». Модель честно допишет проверки, которые сама по умолчанию пропускает. Это дешевле, чем потом читать ошибку в продакшене.
Откуда null приходит в твой проект
Полезно знать «поставщиков» пустоты в лицо — тогда проверку ставишь заранее:
- база данных — пустое поле в таблице приходит как
null; - поиск на странице —
querySelectorне нашёл элемент; - авторизация — до входа пользователь равен
null; - API — сервер вернул
nullна месте объекта, которого нет.
Чем null отличается от пустого массива?
Пустой массив [] — это «список есть, в нём ноль элементов». null — «списка нет вообще». Первое показывают текстом «пока пусто», второе обычно значит, что данные не загрузились.
В Python тоже есть null?
Есть, называется None. Идея та же: намеренное отсутствие значения. И ошибка похожая: 'NoneType' object has no attribute.
Можно просто везде поставить «?.» и забыть?
Не стоит. ?. прячет пустоту, но не объясняет её. Если данных нет там, где они обязаны быть, лучше увидеть падение сразу, чем тихий пустой экран.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





