Клавиша / esc

undefined

Примитивное значение. Используется, когда переменной не присвоено значение.

Время чтения: меньше 5 мин

Кратко

Скопировано

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: Missing initializer in const declaration.

Поговорим немного о приведении типов. Для начала, пример:

        
          
          console.log(null + null); // 0console.log(undefined + undefined); // NaN
          console.log(null + null); // 0
console.log(undefined + undefined); // NaN

        
        
          
        
      

Почему так?

По спецификации EcmaScript

  • null во время сложения приводится к нулю;
  • undefined во время сложения приводится к NaN. NaN это аббревиатура от "not a number" — не число. Результат арифметической операции равен NaN, если во время операции произошла ошибка и ожидаемый числовой результат не может быть выражен числом.

Есть ещё один хитрый пример:

        
          
          console.log(null + []); // "null"
          console.log(null + []); // "null"

        
        
          
        
      

Почему так?

Подсказка, почему так, кроется именно в типе результате: "null" — строка. А не примитивное значение null.

JavaScript сначала приводит массив к примитивному значению. Для этого вызывается метод toString(), который вызывает метод join(). Т.к. массив пустой, то join() вернёт пустую строку "". А сложение чего-то со строкой в JS возвращает строку. Поэтому null уже никуда не приводится, а возращается строка "null".

Немного упомяну и про оператор нулевого слияния (??). В выражении между двумя операндами он будет возвращать первый операнд, если он не равен null или undefined. Можно сказать, что ?? приравнивает смысл undefined и null к «ничего не содержит», и, в этом случае, кладёт в переменную значение второго операнда.