Tiger blog

Блог тигра

Как обработать UNDEFINED в JavaScript

Undefined в JavaScript – это ужас начинающего фронтендера. Чем отличаются undefined и null, если даже сравнение “null == undefined” выводит True, и как обработать исключение undefined? В этой статье будем разбираться.

Что такое undefined?

Для начала нужно понять, что это специальное значение. Следуя из спецификации ECMAScript, undefined в JavaScript можно получить при доступе к неинициализированным переменным, несуществующим свойством объекта, несуществующим свойствам объекта, несуществующим эементам массива и т.д. Пример:

let number; 

number;     // => undefined 

let movie = { name: 'Interstellar' }; 

movie.year; // => undefined 

let movies = ['Interstellar', 'Alexander']; 

movies[3];  // => undefined

Как мы видим, undefined выводиться при попытке получения доступа к:

неинициализированной переменной number;

несуществующему свойству объекта movie.year;

несуществующему элементу массива movies[3].

Оператор typeof возвращает строку undefined для неопределённого значения:

typeof undefined === 'undefined'; // => true

Оператор typeof отлично подходит для проверки значения undefined в JavaScript:

let nothing ;

typeof nothing === ‘undefined’; // => true

Как не наткнуться на undefined

Первое это – неинициализированная переменная

Объявленная переменная, которая не имеет значения по умолчанию – undefined.

let myVariable; 

myVariable; // => undefined

Переменная myVariable уже объявлена, но ещё не имеет присвоенного значения. Попытка обратиться к ней закончится выводом undefined. Чтобы это исправить, достаточно присвоить переменной значение. Чем меньше переменная существует в неинициализированном состоянии, тем лучше.

Ниже приведен способ решения проблемы.

const и let вместо var

Объявленные таким образом объекты и переменные находятся в области видимости, ограниченной текущим блоком кода, и находятся во временной мёртвой зоне до момента присвоения им значения.

При использовании неизменяемых данных (констант) рекомендуется инициализировать их как const:

const myVariable = 'initial'

Константа не подвергается неинициализированному состоянию, и получить значение undefined в этом случае невозможно.

Если вам нужно менять значение переменной, то обозначьте её как let и также присваивайте ей начальное значение:

let index = 0

Проблема var заключается в поднятии переменных: где бы ни находилось объявление, это равнозначно тому, что переменную объявили в начале кода.

function bigFunction() { 

  // код...

  myVariable; // => undefined

  // код...

  var myVariable = 'Initial value';

  // код...

  myVariable; // => 'Initial value'

}

bigFunction();

В этом случае переменная myVariable содержит undefined до получения значения:

myVariable = 'Initial value'

Если же переменную объявить как let, она останется недоступной до момента присвоения ей значения. Таким образом, использование const или let снизит риск получения значения undefined в JavaScript.

Отличиня null и Undefined в JS

Основное отличие в том, что undefined представляет значение переменной, которая ещё не была инициализирована, а null — намеренное отсутствие объекта.

Допустим, переменная number определена, но ей не назначено начальное значение:

let number; 

number; // => undefined

То же самое произойдёт при попытке доступа к несуществующему свойству объекта:

const obj = { firstName: 'Dmitri' }; 

obj.lastName; // => undefined

Или переменная должна ожидать возвращение объекта функции, но по какой-то причине создание объекта невозможно. В этом случае null является значимым индикатором недостающего объекта. Например, clone() — это функция, которая клонирует простой объект JavaScript. Ожидается, что функция вернёт объект:

function clone(obj) { 

  if (typeof obj === 'object' && obj !== null) {

    return Object.assign({}, obj);

  }

  return null;

}

clone({name: 'John'}); // => {name: 'John'} 

clone(15);             // => null 

clone(null);           // => null

Но clone() может быть вызван с пустым аргументом: 15 или null. В этом случае функция не может создать клон, поэтому возвращает null — индикатор отсутствующего объекта.

В JavaScript существуют проверки на null и undefined. Оператор typeof демонстрирует различие между двумя значениями:

typeof undefined; // => 'undefined' 

typeof null;      // => 'object'

Строгий оператор равенства === также отличает undefined от null:

let nothing = undefined; 

let missingObject = null; 

nothing === missingObject; // => false

Заключение 

Стратегия борьбы с undefined в JavaScript:

  • Уменьшить использование неинициализированных переменных.
  • Сделать жизненный цикл переменных коротким и близким к источнику их использования.
  • Назначить начальное значение переменным.
  • Использовать const или let.
  • Проверять наличие свойств или заполнить небезопасные объекты по умолчанию.
  • Использовать значения по умолчанию для некритичных параметров функции.
  • Избегать использования разрежённых массивов.
tiger blog
блог тигра
Все статьи
Начнем охоту
Нацарапайте свои контакты, мы свяжемся с вами в ближайшее время.
Ваше имя
Телефон
Царапнуть заявку
Нажимая на кнопку «Царапнуть заявку», вы соглашаетесь с правилами сайта.
T i g e r
h u n t i n g