undefined
Значение глобального свойства undefined представляет значение undefined . Это одно из примитивных значений JavaScript.
| Атрибуты свойства undefined | |
|---|---|
| Записываемое | нет |
| Перечисляемое | нет |
| Настраиваемое | нет |
Интерактивный пример
Синтаксис
undefined
Описание
undefined является свойством глобального объекта, то есть, это переменная в глобальной области видимости. Начальным значением undefined является примитивное значение undefined .
В современных браузерах (JavaScript 1.8.5 / Firefox 4+), undefined является ненастраиваемым и незаписываемым свойством, в соответствии со спецификацией ECMAScript 5. Даже когда это не так, избегайте его переопределения.
Переменная, не имеющая присвоенного значения, обладает типом undefined . Также undefined возвращают метод или инструкция, если переменная, участвующая в вычислениях, не имеет присвоенного значения. Функция возвращает undefined , если она не возвращает какого-либо значения.
Поскольку undefined не является зарезервированным словом (en-US), он может использоваться в качестве идентификатора (имени переменной) в любой области видимости, за исключением глобальной.
// печатает 'foo string' (function () var undefined = "foo"; console.log(undefined, typeof undefined); >)(); // печатает 'foo string' (function (undefined) console.log(undefined, typeof undefined); >)("foo");
Примеры
Пример: строгое сравнение и undefined
Вы можете использовать undefined и операторы строгого равенства или неравенства для определения того, имеет ли переменная значение. В следующем коде переменная x не определена и инструкция if вычисляется в true .
var x; if (x === undefined) // эти инструкции будут выполнены > else // эти инструкции не будут выполнены >
Примечание: здесь используется оператор строгого равенства (идентичности) вместо простого оператора равенства, поскольку x == undefined также проверяет, является ли x равным null , в то время как оператор идентичности этого не делает. null не эквивалентен undefined . Для более подробной информации смотрите операторы сравнения (en-US).
Пример: оператор typeof и undefined
В качестве альтернативы можно использовать оператор typeof :
var x; if (typeof x === "undefined") // эти инструкции будут выполнены >
Одной из причин использования оператора typeof может быть та, что он не выбрасывает ошибку, если переменная не была определена.
// переменная x не была определена ранее if (typeof x === "undefined") // вычислится в true без ошибок // эти инструкции будут выполнены > if (x === undefined) // выкинет ReferenceError >
Однако, уловки такого рода должны избегаться. JavaScript является языком со статической областью видимости, так что узнать, была ли переменная определена, можно путём просмотра, была ли она определена в охватывающем контексте. Единственным исключением являет глобальная область видимости, но глобальная область видимости привязана к глобальному объекту, так что проверка существования переменной в глобальном контексте может быть осуществлена путём проверки существования свойства глобального объекта (например, используя оператор in ).
Пример: оператор void и undefined
Третьей альтернативой является оператор void .
var x; if (x === void 0) // эти инструкции будут выполнены > // переменная y не была определена ранее if (y === void 0) // выкинет ReferenceError (в отличие от оператора `typeof`) >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-undefined |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2024 by individual mozilla.org contributors. Content available under a Creative Commons license.
Исследование бездны null и undefined в JavaScript

Говоря о примитивных типах данных в JavaScript, большинство имеет в виду самые основные из них: String, Number, и Boolean. Эти примитивы достаточно предсказуемы, и работают так, как от них и ожидается. Однако, речь в данной статье пойдет об менее обыденных примитивных типах, Null и Undefined, о том, в чём они схожи, различны, и, вообще говоря, необычны.
Понимание null и undefined
В JavaScript null — это литерал и ключевое слово языка, которое представляет собой отсутствие какого-либо объекта. Другими словами, null указывает «в никуда». В свою очередь, хоть и похожий по смыслу undefined , олицетворяет отсутствие значения как такового. Оба абсолютно неизменны, не имеют свойств и методов и не способны их иметь. Фактически, попытка обратиться к какому-нибудь свойству, или присвоить его, приведёт к ошибке TypeError . Оба этих примитива, как намекают их имена, совершенно лишены значений.
Это самое отсутствие значения приводит к тому, что они считаются ложными, в том смысле, что они приводятся к false если используются в качестве условия, например, в конструкции if . А если сравнить null и undefined с другими ложными значениями при помощи оператора нестрогого сравнения ( == ), то окажется, что они не равны ничему, кроме самих себя:
null == 0; // false undefined == ""; // false null == false; // false undefined == false; // false null == undefined; // true
Несмотря на эти сходства, null и undefined не эквивалентны. Каждый из них является представителем своего типа: undefined — представляет тип Undefined, а null , соответственно — тип Null. Это легко доказать, сравнив их при помощи оператора строгого сравнения ( === ), который принимает в расчёт не только значения, но и типы данных:
undefined === null; // false
Это важное различие, и оно не случайно, ведь эти примитивы служат для разных целей. Чтобы их различать, вы можете считать undefined неожиданным отсутствием значения, а null — умышленным отсутствием значения.
Получение undefined
Есть множество способов получить значение undefined в коде. Обычно это происходит при попытке получить значение там, где значения нет. В этом случае JavaScript, будучи динамическим, слабо типизированным языком, не покажет ошибку, а выдаст значение по умолчанию, undefined .
Любая объявленная переменная, которой при создании не присвоено никакого значения, имеет значение undefined :
var foo; // по умолчанию undefined
Значение undefined также получается при попытке обратиться к несуществующему свойству объекту или элементу массива:
var array = [1, 2, 3]; var foo = array.foo; // свойство foo не существует, возвращается undefined var item = array[5]; // в массиве нет элемента 5, возвращается undefined
Если в функции нет оператора return , она возвращает undefined :
var value = (function( )<>)(); // возвращает undefined
Если функции не был передан какой-либо аргумент, он становится undefined :
(function(undefined)< // параметр равен undefined >)();
Помимо всего вышеперечисленного, для получения undefined может использоваться оператор void . Некоторые библиотеки, вроде Underscore пользуются этим для надежной проверки типов, потому как void нельзя переопределить, и он всегда возвращает undefined :
function isUndefined(obj)< return obj === void 0; >
Наконец, undefined — это предопределённая глобальная переменная (а не ключевое слово, как null ), которая равна undefined :
'undefined' in window; // true
Начиная с пятой версии ECMAScript эта переменная доступна только для чтения, а, вот, в предыдущих версиях её было возможно переопределить.
Применение null
В первую очередь null отличается своим применением, и в отличие от undefined , null больше используется для присваивания значения. Как раз из-за этого оператор typeof для null возвращает «object». Изначально это объяснялось тем, что null использовался (и используется) как пустая ссылка там, где ожидается объект, что-то вроде заглушки. Такое поведение typeof было позже признано багом, и, хотя было предложено это поведение исправить, пока что, в целях обратной совместимости, всё остается как есть.
Вот, почему окружение JavaScript не выставляет никаких значений в null , и это делается только программно. В документации на MDN написано следующее:
В различных API null часто возвращается в тех местах, где ожидается объект, но такой объект подобрать нельзя.
Это правдиво для DOM, который не зависит от языка и никак не описывается в документации ECMAScript. Из-за того, что используется внешний API, попытка получить отсутствующий элемент возвращает null , а не undefined .
Вообще, если нужно присвоить «не-значение» переменной или свойству, передать его в функцию, или вернуть из функции, то null — это почти всегда лучший вариант. Упрощённо: JavaScript использует undefined , а программисты должны использовать null .
Другой способ применения null — явное «зануливание» переменной ( object = null ), когда ссылка на объект больше не требуется. Кстати, это считается хорошей практикой. Присваивая null , вы фактически удаляете ссылку на объект, и если на него нет других ссылок, он отправляется к сборщику мусора, таким образом возвращая доступную память.
Копнём глубже
Причина того, что null и undefined эдакие чёрные дыры, кроется не только в их поведении, но ещё и в том, как они обрабатываются внутри окружения JavaScript. Они не обладают теми характеристиками, которые обычно присущи другим примитивам и встроенным объектам.
Начиная с ES5 метод Object.prototype.toString , ставший стандартом де-факто для проверки типов, стал полезен в этом отношении и для null с undefined :
Object.prototype.toString.call(null); // [object Null] Object.prototype.toString.call(undefined); // [object Undefined]
Однако, на самом деле у null и undefined этот метод не возвращает внутреннее свойство [[Class]] . По документации он работает следующим образом:
- Если значение this равно undefined , вернуть «[object Undefined]» .
- Если значение this равно null , вернуть «[object Null]» .
- Пусть O равно результату вызова ToObject с this , переданным как аргумент.
- Пусть class равно внутреннему свойству [[Class]] объекта O.
- Вернуть значение String, которое является результатом сложения трёх строк «[object » , class, и «]» .
Этот метод просто возвращает заготовленную строку, если обнаруживает null или undefined , просто чтобы унифицировать функциональность с другими объектами. Такое поведение встречается сплошь и рядом во всей документации, большая часть методов содержат простую проверку, и если встретился null или undefined , возвращают значение сразу. Фактически, нигде не написано, что у них содержатся какие-либо внутренние свойства, обычно имеющиеся у каждого нативного объекта. Это как если бы они вообще не были объектами. Интересно, эти примитивы в окружении JavaScript как-то явно и особо обрабатываются? Может быть, кто-то более знакомый с имплементацией мог бы подсказать.
Заключение
Неважно, насколько необычными кажутся примитивы null и undefined , понимание разницы между ними и их различиями в использовании согласно JavaScript очень важно для понимания языка в целом. Это понимание, конечно же, само по себе не заставит работать ваше приложение или, например, не сломает его, но, строго говоря, оно положительно скажется в долгосрочной перспективе, облегчив вам разработку и отладку будущих проектов.
Комментарий переводчика
При написании этой статьи автор забыл упомянуть одну важную деталь: у примитивов, как таковых, не может быть свойств вообще, они есть только у объектов. А при попытке получить свойство у примитива, он будет неявно преобразован в объект. В этом легко убедиться:
var s = 'test', o = Object(s); o.foo = 42; s.foo = 42; o.foo; // 42 s.foo; // undefined
Дело в том, что null и undefined просто нельзя преобразовать в объект, на чем и строится объяснение ключевых особенностей этих примитивов автором этой статьи.
Также, фраза про то, что null в окружении JavaScript без явного присваивания не используется, неверна. В конце цепочки прототипов находится null , и это как раз тот случай, когда ожидается объект, но его нет:
Object.getPrototypeOf(Object.prototype); // null
![]()
Оригинальная статья: Exploring the Abyss of Null and Undefined in JavaScript Статью вычитывали: SilentImp, cosmiksoul, FMRobot, subzey
© 2013 Frontender Magazine
Кроме материалов, опубликованных под лицензией Creative Commons
JavaScript: undefined
Объявление переменных возможно и без указания конкретного значения. Что будет выведено на экран если её распечатать?
let name; console.log(name); // ?
На экране появится undefined , специальное значение особого типа, которое означает отсутствие значения. Undefined активно используется самим JavaScript в самых разных ситуациях, например, при обращении к несуществующему символу строки:
const name = 'Arya'; console.log(name[8]);
Смысл (семантика) значения undefined именно в том, что значения нет. Однако, ничто не мешает написать такой код:
let key = undefined;
И хотя интерпретатор позволяет такое сделать, это нарушение семантики значения undefined , ведь в этом коде выполняется присваивание, а значит — подставляется значение.
JavaScript — один из немногих языков, в которых в явном виде присутствует понятие undefined . В остальных языках его роль выполняет значение null , которое, кстати, тоже есть в JavaScript.
Вопрос на самопроверку. Почему нельзя объявить константу без указания значения?
Ответ Константу невозможно изменить или переопределить. Ее значение необходимо указывать строго при определении.
Задание
Выведите на экран значение undefined , не указывая его явно (через присваивание или передав напрямую в console.log() ). Если не догадаетесь, как это сделать, подсмотрите решение учителя.
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
Определения
- undefined — аналог отсутствия значения; указывает, что переменной не присвоено значение или она вообще не объявлена.
undefined
Эта глобальная переменная содержит элементарное неопределенное значение — то, которое имеет переменная, значение которой не указано.
Например, функция без директивы return возвращает undefined .
function a() < alert('test') >result = a() // result является undefined alert(result === undefined) // true
Обращение к несуществующему свойству объекта также даст undefined .
result = window.notexists alert(result === undefined) // true
Как видно из примеров, определить, является ли значение undefined , можно строгим (тройным) знаком равенства.
Например, можно проверить, существует ли глобальная переменная:
if (window.somevar !== undefined)
Обратите внимание — при сравнении идет обращение к свойству через заведомо существующий объект window . Поэтому интерпретатор не выдаст ошибку даже если свойства somevar не существует.
Также заметим, что нужен именно строгий оператор сравнения, т.к x==undefined возвратит true также если x является (null), а это уже другое значение.
Строгое сравнение является лучшей альтернативой использованию typeof:
Пример: проверка результата typeof
var x // if (typeof x == «undefined»)
Автор: vasya (не зарегистрирован), дата: 5 августа, 2009 — 12:34
Заметим, что нужен именно строгий оператор сравнения, т.к x==undefined верно также если x является null, а это уже другое значение.
var test = null; alert(test === undefined); // false
Автор: Илья Кантор, дата: 5 августа, 2009 — 14:48
Вопрос непонятен.. Там пример именно с typeof дан в конце статьи.
Автор: Crusader (не зарегистрирован), дата: 19 августа, 2010 — 15:47
строгий оператор сравнения null === undefined — false
обычное сравнение null == undefined — true!
Что не понятного?
Автор: Илья Кантор, дата: 20 августа, 2010 — 14:44
В общем, если в статье что-то неверно или непонятно — напишите Как я понял — в статье все ок
Автор: Гость (не зарегистрирован), дата: 16 августа, 2011 — 11:23
с this вообще не понимаю ничего. уже неделю разбираюсь. Дайте пример, чтоб запустить и все понять
Автор: melky, дата: 16 августа, 2011 — 19:34
a = function()< alert( [this.constructor, this, typeof this].join("\n")) >; obj = <>; a.call(obj); // this ссылается на obj arr = []; a.call(arr); // this ссылается на arr a.call(window); // this ссылается на window a(); // и так тоже.
Автор: cZerro (не зарегистрирован), дата: 6 октября, 2011 — 12:29
Так ведь объект test определён — он равен null. Поэтому строгое сравнение с undefined и дает false. Вот если бы без первой строчки.
Автор: Svetlana (не зарегистрирован), дата: 28 сентября, 2010 — 01:26
Ничего не поняла.
Простите я в этом чайник. Мне надо этот undefined убрать, а я не знаю как, боюсь все порушить.
Автор: Гость (не зарегистрирован), дата: 28 октября, 2010 — 22:45
function test(a) if (a===undefined) alert(‘a is not defined’);
>
test();
Автор: SowingSadness (не зарегистрирован), дата: 25 ноября, 2010 — 11:13
Правильнос делать так: (function( undefined ) < var x; if ( x === undefined ) < . >>)()
Автор: Гость (не зарегистрирован), дата: 7 марта, 2011 — 10:36
undefined это что?
Автор: melky, дата: 16 августа, 2011 — 19:35
значит «значение не присвоено»
Автор: Гость (не зарегистрирован), дата: 18 марта, 2011 — 08:15
спасибо за сайт, добавлю себе в избранное =)
Автор: Гость (не зарегистрирован), дата: 5 мая, 2011 — 11:15
Классно, typeof мне никогда не нравился. Заменю на ===. Причем фишку с == тоже можно использовать, чтобы определить, что в переменной содержится хоть какое-то значение:
if (obj.Field === undefined || obj.Field == null)
меняется на
if (obj.Field == undefined)
Автор: Павел__ (не зарегистрирован), дата: 26 мая, 2011 — 17:24
Стоило бы написать, что несуществующую переменную сравниванием с этой переменной проверять нельзя, потому что возникнет ошибка
alert(typeof(myVar) == 'undefined'); // -> True alert(myVar === undefined); // -> JS Error: "myVar is not defined"
Автор: Богдан (не зарегистрирован), дата: 2 июля, 2011 — 20:07
Илья, просьба замечание Петра внести в статью, так как оно очень важное. Спасибо!
Автор: melky, дата: 16 августа, 2011 — 19:36
не вижу ничего важного. Это основа, которую обязан знать каждый.
Автор: devote, дата: 22 августа, 2011 — 02:42
Ну тогда можно все статьи снести что кажутся основой. Этож должен знать каждый. melky, ты глупость сказал
Автор: neromont, дата: 20 января, 2015 — 06:30
undefined можно использовать в качестве идентификатора, так как значение не является зарезервированным словом.
Автор: Полезные (не зарегистрирован), дата: 31 октября, 2023 — 10:58
Thanks for your answer. You can visit geometry dash online to test your agilty.
Автор: neromont, дата: 20 января, 2015 — 06:34
Также для проверки значения переменной на undefined можно проверить с помощью void:
x === void 0;
Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 — 01:22
Автор: oralie (не зарегистрирован), дата: 23 ноября, 2022 — 12:33
It is a good idea to check slime rancher 2 advancedwriters reviews before making a purchase on the company’s website. A plethora of knowledge on how to use the service was offered by this review.
Автор: AhmedMalik (не зарегистрирован), дата: 26 января, 2023 — 23:53
Cooperate with opponents buffet las vegas near me to have a strategy to overcome difficulties
Автор: LOL BEANS (не зарегистрирован), дата: 27 февраля, 2023 — 06:34
I have bookmarked this site and will refer to it many times in the future. lol beans
Автор: singlegel (не зарегистрирован), дата: 17 августа, 2023 — 07:37
Я очень ценю информацию, которую вы предоставили, и я думаю, что вы проделали отличную работу. free games спасибо
Отправить комментарий
- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
Для остальных вопросов и обсуждений есть форум.
| Поиск по сайту |
Учебник javascript
- Введение
- Основы javascript
- DOM: работа с HTML-страницей
- События
- Объекты, ООП
- AJAX
- Особенности регулярных выражений в Javascript
Основные элементы языка
- Базовые типы: Строки, Числа, Boolean
- Операторы, их особенности в JS
- Массивы
- Функции
- Замыкания
- Регулярные выражения
- Конструкции языка. Обработка ошибок.
Сундучок с инструментами
- Редактирование и отладка скриптов
- Cookie
- HTTP-Отладка
- Просмотр живого HTML
- Разное полезное
Интерфейсы
- Drag and drop
- Грамотное javascript-дерево за 7 шагов
- Интеграция AJAX в интерфейс
- Координаты элемента на странице
- Правильные show/hide/toggle
- Удобное дерево с AJAX-подгрузкой
Все об AJAX
- Введение в Ajax
- Ajax и Rich Client
- Ajax и клиент-серверная архитектура.
- Способы общения с сервером
- COMET
- Форматы данных для AJAX
- Обмен данными для документов с разных доменов
- Обмен данными между доменами. Часть 2.
Оптимизация
- Google Closure Compiler в деталях
- Yahoo: лучшие способы ускорения сайта
- Анализ оптимизации страниц c Yslow
- Интерфейсы. Прочь от MVC
- Оптимизация Javascript-кода
- Польза от documentFragment
- Сжатие Javascript и CSS
- Улучшаем сжимаемость Javascript-кода.
- Умное Кеширование и Версионность в Javascript/CSS
Разное
- Асинхронное программирование
- Google Gears в деталях
- Javascript Flash мост
- Букмарклеты и правила их написания
- О подборке книг на сайте
- Почему — плохо
- Способы идентификации в интернете
- Уровни DOM
- Что почитать?
- Шаблонизация с javascript
- Юнит-тесты уровня браузера на связке Selenium + PHP.
- Справочники: Javascript/HTML/CSS
- Система сборки и зависимостей Google Closure Library
- Хранение данных на клиенте. DOM Storage и его аналоги.
- 10 лучших функций на JavaScript
- เกม สล็อต แตก หนัก.
3 часа 47 минут назад - 스포츠중계
4 часа 56 минут назад - สล็อต แตก หนัก แตก ง่าย.
5 часов 25 минут назад - สล็อต แตก หนัก แตก ง่าย.
5 часов 26 минут назад - thank you for your interesting.
7 часов 18 минут назад - this is really nice to read.
7 часов 36 минут назад - Paypal Login money transfer fees: Type.
7 часов 55 минут назад - I am really inspired with your writing.
8 часов 24 минуты назад - Я так понимаю ссылкой prototype (или ).
9 часов 4 минуты назад - wonka bar
9 часов 8 минут назад
- Как поменять «,» на «;»
- Перевод страниц на лету
- Почему при сортировке удаляются формулы?
- Меню — открывался только один пункт раскрывающего .
- Мой новый проект
- Где в формуле ошибка?
- Нужно чтобы при выборе пункта селектора «Другое» .