JavaScript

В чём разница между null, undefined и undeclared?

null, undefined и undeclared

undefined

Значение не было присвоено. Движок присваивает его автоматически.

let x          // undefined (объявлена, но не инициализирована)
function f() {} // возвращает undefined
const obj = {}
obj.missing     // undefined (нет такого свойства)

null

Явно заданное «пустое» значение. Разработчик сам ставит null - это сигнал «значения нет намеренно».

let user = null  // пользователь ещё не загружен
user = fetchUser()  // теперь объект или null если не найден

undeclared

Переменная вообще не объявлена. Обращение к ней - ReferenceError.

console.log(foo)  // ReferenceError: foo is not defined
typeof foo        // "undefined" - исключение, typeof не кидает ошибку

typeof

typeof undefined  // "undefined"
typeof null       // "object"  ← исторический баг JS
typeof 42         // "number"
typeof "str"      // "string"
typeof true       // "boolean"
typeof {}         // "object"
typeof []         // "object"
typeof function(){} // "function"

Проверки

// Проверить null или undefined одновременно:
if (value == null) { /* null или undefined */ }
if (value != null) { /* точно не null и не undefined */ }

// Nullish coalescing - значение по умолчанию
const name = user?.name ?? "Аноним"

// Optional chaining - безопасный доступ
const city = user?.address?.city  // undefined если чего-то нет

Источники