JavaRush /Курсы /Модуль 1: Web Core /Специальные типы: null

Специальные типы: null, undefined, NaN

Модуль 1: Web Core
21 уровень , 6 лекция
Открыта

1. undefined: переменная есть, значения нет

В программировании часто возникает ситуация, когда значение переменной отсутствует, или оно «не определено», или «не задано», или вообще «не является числом». Для таких случаев в JavaScript есть специальные значения — их можно назвать «особенными гостями на вечеринке типов»:

  • undefined — переменная есть, но значения у неё нет.
  • null — значение есть, но оно явно «ничего».
  • NaN — результат математической операции не является числом.

Каждое из этих значений несёт свой смысл и появляется в определённых ситуациях. Давайте разберёмся с каждым из них.

Что такое undefined?

undefined — это значение, которое автоматически присваивается переменной, если ей не было присвоено никакого значения. Можно сказать, что переменная объявлена, но не определена.

Пример:

let a;
console.log(a); // undefined

Здесь мы объявили переменную a, но ничего в неё не записали. JavaScript честно говорит: «Я не знаю, что там, поэтому это undefined».

Когда появляется undefined?

Неинициализированная переменная

let x;
console.log(x); // undefined

Функция ничего не возвращает

function sayHi() {
  console.log("Hi!");
}
let result = sayHi(); // функция ничего не возвращает
console.log(result); // undefined

Обращение к несуществующему свойству объекта

let user = { name: "Alice" };
console.log(user.age); // undefined

Массив: обращение к несуществующему индексу

let arr = [1, 2, 3];
console.log(arr[10]); // undefined

Можно ли присваивать undefined вручную?

Да, но делать это не рекомендуется. Обычно undefined — это сигнал от самой среды о том, что что-то не определено. Лучше использовать null, если вы хотите явно сказать: «Здесь ничего нет».

let z = undefined; // так можно, но лучше не надо

2. null: значение отсутствует намеренно

Что такое null?

null — это специальное значение, которое означает «здесь ничего нет», «пусто», «значение отсутствует». Это как если бы вы открыли холодильник, а там лежит записка: «Ничего нет, но холодильник работает».

Пример:

let selectedUser = null; // пока пользователь не выбран
console.log(selectedUser); // null

Когда использовать null?

  • Когда нужно явно указать, что значения нет (например, в начале работы программы, до того как появится реальное значение).
  • Когда хотите сбросить переменную: «Здесь раньше было что-то, а теперь пусто».

Пример:

let winner = null; // пока победителя нет
// ... позже
winner = "Alice";

Различия между null и undefined

  • undefined — переменная не инициализирована, значение не присвоено, или свойство не найдено.
  • null — значение намеренно отсутствует, это осознанный выбор программиста.
Ситуация Результат Почему?
let a;
undefined
Объявили, но не присвоили
a = null;
null
Явно присвоили "ничего"
obj.x
undefined
Свойства x нет в объекте
arr[100]
undefined
Элемента с индексом 100 нет
return;
undefined
Функция без return возвращает undefined

3. NaN: Not-a-Number (не число)

Что такое NaN?

NaN — это специальное значение типа number, которое означает «не число». Оно появляется, когда результат математической операции не может быть представлен как обычное число.

Пример:

let result = 0 / 0;
console.log(result); // NaN

В реальной жизни делить на ноль нельзя — и JavaScript честно говорит: «Я не знаю, что тут получилось, поэтому NaN».

Когда появляется NaN?

При некорректных математических операциях:

let a = "abc" * 10; // NaN, нельзя умножить строку на число

При попытке преобразовать нечисловую строку в число:

let n = Number("привет"); // NaN

При делении нуля на ноль, извлечении корня из отрицательного числа и других «запрещённых» операциях:

let x = Math.sqrt(-1); // NaN

Особенности NaN

typeof NaN — это всё равно "number". Да, это шутка от создателей JS.

console.log(typeof NaN); // "number"

NaN не равен даже самому себе!

console.log(NaN === NaN); // false

Это единственный случай в JavaScript, когда значение не равно самому себе.

Для проверки используется функция isNaN():

let value = "abc" * 2;
if (isNaN(value)) {
  console.log("Это явно не число!");
}

4. Примеры из жизни: когда встречаются эти значения

undefined на практике

Ошибка: забыли инициализировать переменную

let userName;
console.log("Имя пользователя:", userName); // Имя пользователя: undefined

Функция ничего не возвращает

function doNothing() {}
let result = doNothing();
console.log(result); // undefined

Обращение к несуществующему свойству

let car = { brand: "Toyota" };
console.log(car.model); // undefined

null на практике

Инициализация переменной «пустым» значением

let currentTask = null;
// ... позже
currentTask = "Проверить почту";

Сброс значения

let session = "active";
// ... пользователь вышел
session = null;

NaN на практике

Ошибка в математике

let price = "двадцать" * 3;
console.log(price); // NaN

Парсинг нечисловой строки

let age = Number("тридцать");
console.log(age); // NaN

5. Проверка на undefined, null и NaN

Как проверить на undefined?

if (myVar === undefined) {
  console.log("myVar не определена");
}

Или просто:

if (typeof myVar === "undefined") {
  console.log("myVar не объявлена или не определена");
}

Как проверить на null?

if (myVar === null) {
  console.log("myVar равна null");
}

Как проверить на отсутствие значения вообще?

Иногда нужно проверить, что переменная либо null, либо undefined:

if (myVar == null) {
  // true, если myVar равна null или undefined
  console.log("myVar отсутствует");
}

Здесь используется двойное равно (==), потому что только оно приводит null и undefined к одному значению.

Как проверить на NaN?

let value = Number("abc");
if (isNaN(value)) {
  console.log("Это NaN!");
}

Внимание: нельзя проверять value === NaN — это всегда false!

6. Примеры: добавим проверки в ваше учебное приложение

Допустим, в вашем приложении есть форма, где пользователь должен ввести число. Давайте добавим обработку всех трёх случаев:

let userInput = prompt("Введите число:"); // допустим, пользователь ничего не ввёл

if (userInput === null) {
  console.log("Пользователь отменил ввод (null)");
} else if (userInput === "") {
  console.log("Пользователь ввёл пустую строку");
} else {
  let num = Number(userInput);
  if (isNaN(num)) {
    console.log("Это не число! (NaN)");
  } else {
    console.log("Введено число:", num);
  }
}

Что происходит:

  • Если пользователь нажал «Отмена» — получаем null.
  • Если пользователь ввёл пустую строку — получаем "".
  • Если ввели что-то, что не преобразуется в число — получаем NaN.

7. Типичные ошибки при работе со специальными значениями

Ошибка №1: Сравнение с NaN через == или ===

Многие новички пытаются проверить, равно ли что-то NaN, вот так:

let n = Number("abc");
if (n === NaN) {
  // Это никогда не выполнится!
}

Это не сработает, потому что NaN !== NaN. Используйте только isNaN().

Ошибка №2: Неявное сравнение null и undefined

Иногда пишут просто if (!value), чтобы проверить, что переменная пуста. Но это сработает и для 0, и для "", и для false. Если нужно проверить именно на отсутствие значения, используйте == null (ловит оба случая) или строгое сравнение.

Ошибка №3: Присваивание undefined вручную

Можно написать x = undefined, но это не лучшая практика. Если хотите явно «обнулить» переменную — используйте null.

Ошибка №4: Ошибки в логике при работе с несуществующими свойствами

Например, если вы обращаетесь к свойству объекта, которого нет, и тут же вызываете у него метод:

let user = {};
console.log(user.name.toUpperCase()); // Ошибка! user.name — undefined

Перед обращением к свойствам лучше проверить, что оно существует.

Ошибка №5: Ожидание, что функция всегда что-то возвращает

Если функция не возвращает значение, результат будет undefined. Это может привести к неожиданным ошибкам, если вы попытаетесь использовать это значение как число или строку.

1
Задача
Модуль 1: Web Core, 21 уровень, 6 лекция
Недоступна
Отмена перехода
Отмена перехода
1
Задача
Модуль 1: Web Core, 21 уровень, 6 лекция
Недоступна
Остановка всплытия
Остановка всплытия
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ