Null и Undefined¶
В JavaScript (и, соответственно, TypeScript) есть два нижних типа: null
и undefined
. Они предназначены для обозначения разных вещей:
- Что-то еще не инициализированное:
undefined
. - Что-то недоступное в данный момент:
null
.
Проверяем оба¶
Факт в том, что вам придется столкнуться с обоими. Просто проверьте их через ==
1 2 3 4 5 6 7 8 9 |
|
Поручите == null
проверить undefined
или null
. Как правило, нет необходимости делать между ними различия.
1 2 3 4 5 6 |
|
Одно исключение: значения undefined
корневого уровня, которые мы обсудим далее.
Проверяем undefined
корневого уровня¶
Помните, как я сказал вам использовать == null
? Не используйте его для вещей корневого уровня. В строгом режиме, если вы используете foo
и foo
является undefined
, вы получите исключение ReferenceError
и весь стек вызовов прервётся.
Вы должны использовать строгий режим ... и на самом деле компилятор TS включит его для вас, если вы используете модули ... подробнее об этом будет сказано позже, так что не парьтесь :)
Поэтому, чтобы проверить, задана ли переменная на глобальном уровне, используйте typeof
:
1 2 3 4 |
|
Ограничьте явное использование undefined
¶
Потому что TypeScript дает вам возможность документировать ваши структуры отдельно от значений. Вместо того чтобы делать так:
1 2 3 4 5 6 |
|
вы должны использовать аннотацию типов:
1 2 3 4 5 6 |
|
Колбэки в стиле Node¶
Функции колбеков в стиле Node (вроде (err,somethingElse)=>{ /* что-нибудь */ }
) обычно вызываются с err
равным null
, если нет ошибок. Как бы то ни было, в общем случае просто используйте проверку на истинность:
1 2 3 4 5 6 7 |
|
Когда создаёте свои собственные API, в подобных ситуациях нормально использовать null
для согласованности. Но, честно говоря, лучше посмотреть в сторону промисов, тогда вам вообще не придется париться из-за пустых значений ошибок (вы обработаете их через .then
и .catch
).
Не используйте undefined
для обозначения валидности¶
Для примера, ужасная функция:
1 2 3 |
|
может быть написана намного лучше:
1 2 3 4 5 6 7 8 9 10 |
|
JSON и сериализация¶
В стандарте JSON есть поддержка кодирования null
, но нет undefined
. При кодировании в JSON объекта с атрибутом, равным null
, атрибут будет включён с нулевым значением, в то время как атрибут со значением undefined
будет полностью исключён.
1 |
|
В результате, базы данных, основанные на JSON, могут поддерживать значения null
, но не undefined
. Поскольку атрибуты со значением null
закодированы, вы можете намеренно очистить атрибут, установив его значение в null
перед кодированием и передав объект в удаленное хранилище.
Установка значений undefined
может сэкономить память и затраты на передачу, поскольку названия атрибутов не будут закодированы. Однако, это может усложнить семантику очистки значений по сравнению с отсутствующими значениями.
Заключительная мысль¶
Команда TypeScript не использует null
: TypeScript coding guidelines и это не вызвало никаких проблем. Дуглас Крокфорд считает, что null
- это плохая идея и всем нам лучше использовать undefined
.
Как бы то ни было, стиль NodeJS использует null
для аргументов Error в качестве стандарта, посколько это означает Что-то в настоящий момент недоступно
. Лично я не хочу разрываться между ними двумя, ведь большинство проектов используют библиотеки с разными подходами, и в обоих случаях использую просто == null
.