Перейти к содержимому

Undefined javascript что это

  • автор:

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]] . По документации он работает следующим образом:

  1. Если значение this равно undefined , вернуть «[object Undefined]» .
  2. Если значение this равно null , вернуть «[object Null]» .
  3. Пусть O равно результату вызова ToObject с this , переданным как аргумент.
  4. Пусть class равно внутреннему свойству [[Class]] объекта O.
  5. Вернуть значение 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 минут назад
  • Как поменять «,» на «;»
  • Перевод страниц на лету
  • Почему при сортировке удаляются формулы?
  • Меню — открывался только один пункт раскрывающего .
  • Мой новый проект
  • Где в формуле ошибка?
  • Нужно чтобы при выборе пункта селектора «Другое» .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *