Клавиша / esc

null

Примитивное значение. Представляет собой намеренное отсутствие значения объекта. Состоит из единственного значения null и обозначает объект с неопределённой структурой.

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

Кратко

Скопировано

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: 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 к «ничего не содержит», и, в этом случае, кладёт в переменную значение второго операнда.