Кратко
СкопированоUndefined — это тип, состоящий из одного значения undefined
. Оно используется, чтобы обозначить, что переменной не присвоено значение.
Если переменная инициализирована с помощью let
или var
и ей не присвоено значение, то JavaScript автоматически устанавливает значение undefined
.
Пример
СкопированоJavaScript автоматически устанавливает значение undefined
новой переменной:
let nameconsole.log(name)// undefined
let name console.log(name) // undefined
Также JavaScript автоматически устанавливает значение undefined
в аргумент функции, если значение не передали при вызове:
function hello(name) { console.log('Привет, ' + name)}hello('Витя')// Привет, Витяhello()// Привет, undefined
function hello(name) { console.log('Привет, ' + name) } hello('Витя') // Привет, Витя hello() // Привет, undefined
Вручную установленное undefined
используют, чтобы обозначить неизвестное значение:
const person = { name: 'Пётр', lastName: 'Романов', age: undefined}
const person = { name: 'Пётр', lastName: 'Романов', age: undefined }
Но будьте аккуратны, когда устанавливаете undefined
свойствам объектов. Если у объекта person
удалить age
, то при обращении к несуществующему свойству также вернётся undefined
.
Как понять
Скопированоundefined
обозначает, что значение по каким-то причинам ещё не установлено или неизвестно. В этом контексте его использует сам язык JavaScript.
В языке существует похожее примитивное значение null
. Оно обозначает намеренное отсутствие значения объекта. undefined
и null
можно легко спутать, потому что это близкие понятия. Различие состоит в том, что null
обозначает намеренное отсутствие значения объекта, а undefined
— что переменной не задано, но эта переменная не объект.
Пример разницы использования
Скопировано// Переменная person сделана под объект, но структура объекта ещё неизвестнаlet person = null// Определились со структурой объектаperson = { name: 'Пётр', age: 25, // Поле profession — строка. Пётр ещё не определился, поэтому undefined profession: undefined}
// Переменная person сделана под объект, но структура объекта ещё неизвестна let person = null // Определились со структурой объекта person = { name: 'Пётр', age: 25, // Поле profession — строка. Пётр ещё не определился, поэтому undefined profession: undefined }
Ещё один интересный пример, наглядно показывающий, что значит «отсутствие значения»:
function toLog(a, b = a) { console.log(a, b)}toLog(1, undefined) // 1 1toLog(1, null) // 1 nulltoLog(1) // 1 1
function toLog(a, b = a) { console.log(a, b) } toLog(1, undefined) // 1 1 toLog(1, null) // 1 null toLog(1) // 1 1
Когда аргумент не передан, JavaScript неявно подставляет undefined
. Код в примере выглядит так, будто мы передали аргумент. На самом деле такая запись ничем не отличается от случая, когда аргумент не передаётся вовсе и используется значение по умолчанию.
На практике
Скопированосоветует Скопировано
🛠 Разделение между 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
к «ничего не содержит», и, в этом случае, кладёт в переменную значение второго операнда.