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 — значение намеренно отсутствует, это осознанный выбор программиста.
| Ситуация | Результат | Почему? |
|---|---|---|
|
|
Объявили, но не присвоили |
|
|
Явно присвоили "ничего" |
|
|
Свойства x нет в объекте |
|
|
Элемента с индексом 100 нет |
|
|
Функция без 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. Это может привести к неожиданным ошибкам, если вы попытаетесь использовать это значение как число или строку.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ