в чем разница между null и undefined js
Настоящее и будущее безопасной работы с null и undefined в JavaScript
Основные сведения
Undefined — это примитивное значение, которое автоматически назначается объявленным, но неинициализированным переменным. Это значение можно получить, обратившись к несуществующему свойству объекта или к несуществующему аргументу функции.
Посмотрим, что произойдёт, если выполнить такой код:
Он выдаст следующую ошибку:
Проверка на null и undefined
Хотя это и работает, смотрятся такие конструкции не очень-то хорошо.
Прежде чем продолжить размышления о null и undefined в JavaScript, поговорим о том, как подобные значения обрабатываются в других языках.
Другие языки
Надо отметить, что проблема работы с неопределёнными значениями присутствует в большинстве языков программирования. Посмотрим, как проводятся проверки, подобные вышеописанным, в других языках.
В Java есть api Optional :
▍Kotlin
Как работать с undefined в JS?
После рассмотрения возможностей по работе с неопределёнными значениями в других языках, я задался вопросом о том, есть ли возможность безопасно работать с undefined в JavaScript и при этом не писать километры кода. Поэтому я приступил к экспериментам с регулярными выражениями. Мне хотелось создать функцию, которая позволила бы безопасно получать доступ к свойствам объектов.
Однако, честно говоря, я не отношусь к фанатам строковых путей, поэтому я начал искать способ, который позволил бы избежать их использования. В результате я создал решение, основанное на прокси-объектах:
Будущее безопасной работы с null и undefined в JavaScript
Сейчас в комитете TC39 имеется предложение, которое позволяет пользоваться следующими конструкциями:
По мне, так выглядит это очень аккуратно. Однако это предложение пока находится на достаточно ранней стадии согласования, то есть, его потенциальное появление в языке может занять некоторое время. Но, несмотря на это, существует плагин для babel, который позволяет уже сегодня пользоваться подобными конструкциями.
Итоги
Уважаемые читатели! Какой из упомянутых в этом материале способов безопасной работы с null и undefined в JavaScript нравится вам больше всего?
7 советов по обработке undefined в JavaScript
Авторизуйтесь
7 советов по обработке undefined в JavaScript
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
Что такое undefined в JavaScript
undefined является специальным значением. Согласно спецификации ECMAScript, undefined в JavaScript можно получить при доступе к неинициализированным переменным, несуществующим свойствам объекта, несуществующим элементам массива, etc. Пример:
Как видим, undefined выводится при попытке доступа к:
Оператор typeof возвращает строку undefined для неопределённого значения:
Оператор typeof отлично подходит для проверки значения undefined в JavaScript:
Как избежать undefined в JavaScript
Неинициализированная переменная
Ниже приведены способы решения проблемы.
1. const и let вместо var
Объявленные таким образом объекты и переменные находятся в области видимости, ограниченной текущим блоком кода, и находятся во временной мёртвой зоне до момента присвоения им значения.
При использовании неизменяемых данных (констант) рекомендуется инициализировать их как const :
Константа не подвергается неинициализированному состоянию, и получить значение undefined в этом случае невозможно.
Если вам нужно менять значение переменной, то обозначьте её как let и также присваивайте ей начальное значение:
Проблема var заключается в поднятии переменных: где бы ни находилось объявление, это равнозначно тому, что переменную объявили в начале кода.
В этом случае переменная myVariable содержит undefined до получения значения:
2. Усиление связности
Связность характеризует степень взаимосвязи элементов модуля (пространства имён, класса, метода, блока кода). Сильная связность предпочтительнее, поскольку предполагает, что элементы модуля должны фокусироваться исключительно на одной задаче. Это поможет модулю быть:
Блок кода сам по себе может считаться небольшим модулем. Чтобы извлечь выгоду из преимуществ сильной связности, нужно держать переменные как можно ближе к блоку кода, который их использует.
Вот классический пример того, как не надо делать:
Доступ к несуществующему свойству
Сам по себе доступ к не вызовет ошибку, а вот при попытке получить значение из несуществующего свойства выведется ошибка:
Проблема в особенностях JavaScript: свойство может быть установлено или отсутствовать. Хорошее решение — установка правил, которые обязывают задать свойствам значения.
Но не всегда возможно контролировать объекты, с которыми приходится работать. Такие объекты могут иметь разный набор свойств в различных сценариях, и каждый из них нужно обрабатывать вручную.
0 и false — ложные значения, потому что if (toAppend.first)<> и if (toAppend.last)<> фактически сравниваются с ложными значениями, и эти элементы не вставляются в массив. Функция возвращает исходный массив [10] без изменений.
1. Наличие свойства
К счастью, JavaScript предлагает множество способов определить, имеет ли объект определённое свойство:
2. Деструктуризация доступа к свойствам объекта
Деструктуризация объекта позволяет устанавливать значение по умолчанию, если свойство не существует: удобно для исключения прямого контакта с undefined :
Применяя преимущества деструктуризации объекта, реализуем quote() :
Деструктурирующее присваивание гарантирует, что используется пустой объект, если второй аргумент не указан вообще. В результате вы избегаете возникновения значения undefined в JavaScript.
3. Свойство по умолчанию
Есть простой способ установить значения по умолчанию для свойств объекта, и имя ему Spread syntax:
Параметры функции
Функция, имеющая определённые параметры, должна вызываться с одинаковым количеством аргументов. В таком случае параметры получают ожидаемые значения:
Лучшим подходом является использование параметров по умолчанию из ES2015:
Возвращаемое значение функции
То же происходит, если return присутствует, но без какого-либо выражения рядом:
Теперь вызов функции выведет нужное значение.
Оператор void
Оператор void выполняет выражение и возвращает undefined вне зависимости от результата:
Одним из вариантов использования оператора void является переопределение результата выполнения выражения и возврат undefined в случае возникновения неожиданных результатов выполнения функции.
Значение undefined в массивах
Вы получаете undefined при попытке доступа к элементу массива с индексом вне пределов массива.
В JavaScript вы можете столкнуться с так называемыми разрежёнными массивами. Эти массивы имеют пробелы, то есть на некоторых индексах не определены никакие элементы. Когда делаем попытку получить доступ к пустому значению в разрежённом массиве, на выходе получаем undefined :
Отличие null и undefined в JavaScript
Основное отличие в том, что undefined представляет значение переменной, которая ещё не была инициализирована, а null — намеренное отсутствие объекта.
Допустим, переменная number определена, но ей не назначено начальное значение:
То же самое произойдёт при попытке доступа к несуществующему свойству объекта:
Или переменная должна ожидать возвращение объекта функции, но по какой-то причине создание объекта невозможно. В этом случае null является значимым индикатором недостающего объекта. Например, clone() — это функция, которая клонирует простой объект JavaScript. Ожидается, что функция вернёт объект:
Строгий оператор равенства === также отличает undefined от null :
Вам также может быть интересна наша статья про обработку ошибок в JavaScript.
Заключение
Стратегия борьбы с undefined в JavaScript:
В чем практические отличия null от undefined?
Задался вопросом, какая практическая разница между null и undefined, без отсылки как они работают, а именно что они значат?
Пока не могу найти практического кейса, где null нельзя заменить undefined без потери смысла.
В теории null = пусто (нет данных), undefined = переменная определена, но данных не определены (т.е. тоже самое что null, по идее), но как это наложить на практику в JS, не понятно.
Подскажите, кто сталкивался.
Средний 4 комментария
как это наложить на практику в JS, не понятно
Это не конкретно про использование `null`.
С таким же успехом можно проинициализировать с null или false, и условие выхода сделать на проверку значения.
Вопрос, почему именно undefined, или почему именно null использовать в примере 🙂
Мы можем сказать при `var a = null` что значение так и не найдено по результату работы цикла (если значение так и осталось null).
При `var a` мы скажем ровно тоже самое, даже если там `undefined`.
Нашел вот это, это более-менее вносит ясность:
Setting a variable to null initially indicates your intent for that variable; it should even-
tually contain an object.
Это нужен талант — написать очень много текста и забыть ответить на вопрос автора 🙂
Вопрос-то совсем в другую сторону: практическая сторона двух эти null и undefined какая, перед нормальными языками, где есть максимум один тип, обозначающий «пустоту»?
В теории null = пусто (нет данных), undefined = переменная определена, но данных не определены (т.е. тоже самое что null, по идее), но как это наложить на практику в JS, не понятно.
Нет.
null это значение переменной, обозначающее что-то там, не важно что, но с этим можно что-то сделать или проверить.
undefiend обозначает лишь то, что переменная/свойство не определена, это так и переводится, загляни в словарь, если не веришь.
Вопросов не должно остаться.
Вот и все, что вам нужно знать!
Я выделяю 2 момента (исключая частности JS с равенством), возможно это будет полезно для вас.
Первый. После декларации чего либо при не указанном значении, что либо будет неопределенно, соответственно undefined.
Если соблюдать эти правила, то подводных камней не будет. В частности встречал случай с Object.assign. Если нужно спроицировать объект на условно нулевую (чистую) модель, у модели не должно быть undefined, иначе свойство присвоено не будет (должно быть null).
Взял вот отсюда. Там расписано подробнее и с примерами, если интересно.
Все о null в JavaScript
Как вы уже, наверное, знаете в языке JavaScript реализовано две большие группы типов данных: примитивы (строки, логические значения, числа, символы) и объекты.
Объекты — это сложные структуры данных. Самым простым объектом в JavaScript является объект представляющий собой набор ключей и соответствующих им значений:
1. Концепция null
Спецификация JavaScript говорит следующее о null :
null — примитивное значение, которое представляет намеренное отсутствие какого-либо значения типа объект.
Таким образом, если вы замечаете, что значение null было присвоено переменной или возвращается функцией, то этим значением, в общем случае, должен быть объект, но по какой-то причине он не был создан.
1.1 Аналогия null из реального мира
Думая об аналогии с реальным миром, вы можете представить себе переменную как коробку. Точно так же, как переменная может содержать объект, коробка может содержать некоторые предметы, например, чайник.
2. Проверка значения переменной на null
Хороший способ проверить содержит ли значение какой-либо переменной null — использовать оператор строгого равенства :
2.1 null — это ложное значение (false)
2.2 Тип null
3. Ловушка null
Давайте снова воспользуемся функцией greetObject() и попробуем получить доступ к свойству message у возвращенного объекта:
Обычно для того, чтобы избежать такого эффекта используются два альтернативных варианта, которые мы рассмотрим в следующем разделе.
4. Альтернативы использованию null
И хотя очень заманчиво возвращать значение null в том случае, если вы не можете по той или иной причине создать объект, но у этой практики есть существенные недостатки.
Как только значение null появляется в вашем стеке выполнения, то вы обязательно должны проверять его присутствие.
Либо возбуждать исключение с выводом соответствующего сообщения об ошибке:
Рассмотренные практики написания кода позволяют вам не использовать null вообще, и избежать проблем с отладкой и сопровождением вашего кода в будущем.
5. null vs undefined
undefined — соответствует значению неинициализированной переменной или свойства объекта.
Например, если вы объявляете переменную без присвоения начального значения, то результатом операции доступа к ее значению переменной будет undefined :
Основное различие между null и undefined заключается в том, что значение null интерпретируется как отсутствие в качестве значения некоторого объекта, а — undefined как неинициализированное состояние переменной или возвращаемого значения.
Использование оператора строгого равенства позволяет === позволяет различать значения null и undefined :
В то время как оператор нестрогого равенства == определяет, что null и undefined эквивалентны:
Использование оператора нестрого равенства для проверки, содержит ли переменная null или undefined приведет к получению следующего результата:
6. Заключение
null — специальное значение, реализованное в языке JavaScript, которое соответствует отсутствию объекта, который ожидается в качестве значения переменной или должен возвращаться функцией.
Значения null и undefined в какой-то степени эквивалентны, тем не менее, null представляют собой отсутствующее значение типа объект, а undefined неинициализированное состояние переменной или значения возвращаемого функцией.
JavaScript checking for null vs. undefined and difference between == and ===
What is the difference between == and === (it’s hard to search Google for «===» )?
8 Answers 8
Is the variable null :
Now, despite the above, the usual way to check for those is to use the fact that they’re falsey:
This is defined by ToBoolean in the spec.
They’re both values usually used to indicate the absence of something. undefined is the more generic one, used as the default value of variables until they’re assigned some other value, as the value of function arguments that weren’t provided when the function was called, and as the value you get when you ask an object for a property it doesn’t have. But it can also be explicitly used in all of those situations. (There’s a difference between an object not having a property, and having the property with the value undefined ; there’s a difference between calling a function with the value undefined for an argument, and leaving that argument off entirely.)
Interestingly (or not), they’re their own types. Which is to say, null is the only value in the Null type, and undefined is the only value in the Undefined type.
What is the difference between «==» and «===»
Type coercion uses quite complex rules and can have surprising results (for instance, «» == 0 is true).