Кратко
СкопированоNull — это тип, единственным значением которого является значение null
.
Значение null
используют, когда нужно обозначить намеренное отсутствие значения объекта (объект с неопределённой структурой).
Пример
СкопированоОжидается объект пользователя, но пока неясна структура этого объекта:
let personObj = nullpersonObj = { name: 'Вася', age: 25,}
let personObj = null personObj = { name: 'Вася', age: 25, }
Как понять
Скопированоnull
обозначает понятия «отсутствует» или «значение неизвестно» у объекта. Оно всегда явно задаётся программистом, JavaScript автоматически не устанавливает его.
В JavaScript null
используется только для обозначения конца цепочки прототипов, чтобы показать, что следующий прототип отсутствует.
В языке существует похожее примитивное значение undefined
. Оно обозначает, что переменной ещё не присвоено значение. Их можно легко спутать, потому что оба обозначают отсутствие значения. Разница состоит в том, что null
обозначает намеренное отсутствие значения объекта (объект без заданной структуры), а undefined
— что переменной (не объекту) ещё не присвоено значение.
Например, сам JavaScript использует undefined
для обозначения неинициализированных переменных:
// Ожидается строка (не объект)let personNameconsole.log(personName)// undefined// В явном виде говорим, что значение отсутствуетpersonName = undefined// Ожидается объект пользователя,// но пока неясна структура этого объектаlet personObj = nullpersonObj = { name: 'Вася', age: 25, // Название профессии, строка // Вася ещё не определился с профессией, поэтому undefined profession: undefined,}// Функция должна вернуть объект// В случае, если объект вернуть нельзя, возвращает nullfunction returnObject (condition) { if (condition === true) { return { name: 'Вася', age: 25, } } // Функция не смогла вернуть объект, // возвращаем объект с неопределённой структурой return null}
// Ожидается строка (не объект) let personName console.log(personName) // undefined // В явном виде говорим, что значение отсутствует personName = undefined // Ожидается объект пользователя, // но пока неясна структура этого объекта let personObj = null personObj = { name: 'Вася', age: 25, // Название профессии, строка // Вася ещё не определился с профессией, поэтому undefined profession: undefined, } // Функция должна вернуть объект // В случае, если объект вернуть нельзя, возвращает null function returnObject (condition) { if (condition === true) { return { name: 'Вася', age: 25, } } // Функция не смогла вернуть объект, // возвращаем объект с неопределённой структурой return null }
На практике
Скопированосоветует Скопировано
🛠 Оператор typeof
определяет тип null
как 'object'
. Это происходит потому, что примитивное значение null
обозначает объект, у которого в данный момент не определена структура.
console.log(typeof null)// 'object'
console.log(typeof null) // 'object'
🛠 Разделение между undefined
и null
такое:
undefined
обозначает, что переменной не присвоено значение, и эта переменная не объект;null
— объект с неопределённой структурой.
Например, приложение ожидает ответ от сервера вида:
const data = { users: [] // массив пользователей success: true // статус ответа сервера}
const data = { users: [] // массив пользователей success: true // статус ответа сервера }
Если нам, по какой-то причине, нужно заранее инициализировать переменную data
, то это можно сделать так:
let data = null // Какая-то логика // Ожидаем ответ сервера в виде объекта data = await getUsers()
let data = null // Какая-то логика // Ожидаем ответ сервера в виде объекта data = await getUsers()
Если что-то сломалось, то сервер должен вернуть именно null
в ответ на запрос, потому что ожидался именно объект.
🛠 Уточняйте договорённости по undefined
и null
на проекте. Иногда эти значения путают и используют неправильно.
На собеседовании
Скопировано отвечает
Скопированоnull
задаётся переменной явно и означает, что она является объектом, но структура этого объекта ещё не определена. undefined
присваивается переменной (переменная не декларирует объект), когда она была объявлена, но не было определено её начальное значение. Функция может возвращать undefined
или null
. Всё зависит от того, что мы ожидаем в результате работы функции. Если мы ожидаем объект, но по каким-то причинам функция его вернуть не может, то возвращаем null
. Если функция должна вернуть, например, число (главное, не объект), но не может этого сделать, то она возвращает undefined
.
Без начального значения можно оставлять только переменную, объявленную через let
или var
. Если объявить переменную через const
и не задать ей начального значения, будет ошибка: Uncaught SyntaxError
.
Поговорим немного о приведении типов. Для начала, пример:
console.log(null + null); // 0console.log(undefined + undefined); // NaN
console.log(null + null); // 0 console.log(undefined + undefined); // NaN
Почему так?
null
во время сложения приводится к нулю;undefined
во время сложения приводится кNaN
.NaN
это аббревиатура от "not a number" — не число. Результат арифметической операции равенNaN
, если во время операции произошла ошибка и ожидаемый числовой результат не может быть выражен числом.
Есть ещё один хитрый пример:
console.log(null + []); // "null"
console.log(null + []); // "null"
Почему так?
Подсказка, почему так, кроется именно в типе результате: "null" — строка. А не примитивное значение null
.
JavaScript сначала приводит массив к примитивному значению. Для этого вызывается метод to
, который вызывает метод join
. Т.к. массив пустой, то join
вернёт пустую строку ""
. А сложение чего-то со строкой в JS возвращает строку. Поэтому null
уже никуда не приводится, а возращается строка "null"
.
Немного упомяну и про оператор нулевого слияния (?
). В выражении между двумя операндами он будет возвращать первый операнд, если он не равен null
или undefined
. Можно сказать, что ?
приравнивает смысл undefined
и null
к «ничего не содержит», и, в этом случае, кладёт в переменную значение второго операнда.