Null и undefined в JavaScript на самом деле являются значениями и типами, созданными для имитации ошибок и ключевых слов, распространенных в других языках программирования.

Когда переменная не определена или унифицирована, в большинстве языков программирования это означает, что пространство в памяти было назначено имени переменной, но программист еще ничего не сделал с этим пространством в памяти. Обычно это приводит к ошибке времени компиляции.

Когда переменная имеет значение null в других языках программирования, null обычно является ключевым словом, чтобы указать, что пространство в памяти является указателем (ссылкой), и этот указатель указывает на недопустимый адрес памяти (обычно 0x0). Обычно это используется, когда программист использует значение переменной и хочет целенаправленно очистить его, буквально указав на пустоту.

В JavaScript `null` и` undefined` являются значениями и типами. Так же, как числа и символы, null имеет особую конфигурацию из единиц и нулей, что указывает на то, что его тип - null, а значение - null. То же самое с undefined. Они используются в JavaScript в качестве заполнителей, чтобы сообщить программисту, когда переменная не имеет значения.

Какая разница?

Неопределенный означает, что переменная не имеет значения (или свойство не существует), потому что программист еще не присвоил ей значение (или не создал свойство).

Null должен сигнализировать о том, что переменная не имеет значения , потому что программист целенаправленно очистил значение и установил его на `null`.

Таким образом, вы должны всегда устанавливать переменные только в `null`. Никогда не в undefined.

... ЕСЛИ вы не работаете с существующим кодом или конкретным api или библиотекой, явно проверяющим на наличие undefined, то, конечно, чтобы заставить поведение, которое вы хотите, вам придется сделать исключение.

А что насчет typeof?

Но почему `typeof null === 'object’`? Что ж, все ссылочные типы (указатели) в JavaScript являются объектами. В раннем JavaScript значение null предназначалось для имитации нулевого указателя (ссылки), следовательно, было жестко запрограммировано возвращать «объект» для его типа. По крайней мере, это мое лучшее предположение, по словам Брендана Эйха, это ошибка. Я думаю, он просто забыл.