Что именно undefined означает в JavaScript? Почему это там? Какие у него использования? Чем это может быть полезно?

11

В JavaScript у нас есть нечто, называемое неопределенным . Я сказал что-то, потому что я действительно не знаю, является ли это базовым классом, или встроенной переменной, или ключевым словом, или чем-то еще. Я просто знаю, что это там.

Чтобы увидеть это в действии, вы можете просто написать:

undefined;
typeof undefined;

Может кто-нибудь объяснить мне, почему эта вещь была вставлена ​​в JavaScript? У нас есть nullценность в этом языке, поэтому это не должно быть что-то вроде null. В других языках, когда мы не знаем значение свойства или переменной, мы просто устанавливаем его в null. Здесь мы можем сделать то же самое.

Как мы можем использовать эту вещь в JavaScript?

Саид Нямати
источник

Ответы:

13

Есть две вещи, которые вы должны понимать о неопределенных ...

  • тип undefined , который может иметь только одно значение .
  • переменная undefined

Теперь внимательно прочитайте следующее ...

  • Существует так много значений типа number(10, 10.01, 1e1). Но может быть только одно значение типа undefined, и это значение сохраняется в переменной undefined. Это значение имеет никакого буквальное представление - например, числовые значения 1, 100, 1e-1все литералы номера типа, но значение , сохраненное в переменном undefinedне имеет буквальную формы.

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

  typeof не определено; // "undefined"

  undefined = 100;
  typeof не определено; // "число"

  undefined = void 0;
  typeof не определено; // "undefined"

  window.undefined === undefined; // правда
  window.undefined === void 0; // правда
  
  • если вы не хотите использовать переменную undefined, вы можете сгенерировать значение типа undefinedс помощью выражения void 0- единственная цель которого - вернуть значение типа undefined.

... может кто-нибудь объяснить мне, почему эта вещь была вставлена ​​в JavaScript ...

NO. Так же, как никто не может объяснить, почему необъявленные переменные переходят в глобальную область вместо локальной. Вам просто нужно научиться разумно использовать его, а не пытаться найти оправдания его существованию.

... у нас есть нулевое значение ...

Хотя nullможет делать вещи undefined, это более или менее связано, objectsа не скаляры. Действительно, JavaScript считает nullсебя объектом - typeof nullвозвращает «объект».

По моему мнению, суть в том, чтобы НЕ пытаться рассуждать об абсолютных целях undefinedи null- и использовать их в вашем коде разумно, чтобы ваш код был читабельным, обслуживаемым и повторно используемым.

treecoder
источник
2
Хорошее объяснение @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and nullПохоже, что JavaScript немного сложнее, чем логический язык, и мы просто должны привыкнуть к нему, как экспериментировать в новом мире.
Саид Neamati
1
msgstr "единственная цель которого - вернуть значение типа undefined". Фактически voidоценивает выражение, игнорирует возвращаемое значение и возвращает undefinedзначение. Что касается различий. undefinedиспользуется движком JS, чтобы сказать, что эта вещь не имеет значения. nullиспользуется вами, чтобы сказать, что эта вещь не имеет значения. Есть четкое различие.
Райнос
1
undefined = 100; typeof undefined;возвращает «undefined» для меня, если вы пытаетесь присвоить ноль, вы получаете ошибку. Просто хотел уточнить это для будущих читателей.
Джош Рамбут
6

Извините за ответ на более старый вопрос, но причина, по которой вам нужны как неопределенные, так и нулевые значения, проста: в языке типизации утки на основе прототипа вы должны обязательно различать «этот объект не определяет значение для X» и «этот объект говорит, что X ничего / нуль / пусто».

Без этой возможности невозможно обойти цепочку прототипов, и поэтому наследование не может работать; Вы должны быть в состоянии определить, что obj.someProp не определен, чтобы вы могли смотреть на obj.prototype.someProp и далее вверх по цепочке, пока не найдете значение. Если obj.someProp вернул null, не было бы способа узнать, действительно ли он нулевой или просто означал «посмотрите на мой прототип». Единственный способ обойти это - добавить закулисную магию за кулисы, которая лишает вас способности размышлять с цепями прототипов и делать различные другие элементы черной магии JS.

Как и большая часть Javascript, идея undefined и null сначала кажется вонючей и глупой, а потом абсолютно блестящей (затем снова вонючей и глупой, но с разумным объяснением).

Такой язык, как C #, не будет компилироваться, если вы получите доступ к несуществующему свойству, а другие динамические языки часто выдают исключения во время выполнения, когда вы прикасаетесь к несуществующему свойству, что означает, что вы должны использовать специальные конструкции для их проверки. Плюс классы означают, что когда объект создается, вы уже знаете его цепочку наследования и все свойства, которыми он обладает - в JS я могу изменить прототип на 15 шагов вверх по цепочке, и эти изменения появятся в существующих объектах.

russbishop
источник
3

Существует глобальная переменная undefined, для которой установлено неопределенное значение. Злые люди могут настроить это на что-то другое, поэтому, вероятно, лучше не доверять этому.

  • Неопределенное значение - это возвращаемое значение функции, которая не возвращает значение.
  • Неопределенное значение - это значение переменной, которая не была назначена.
  • Неопределенное значение - это значение параметра, который не был передан.
  • Неопределенное значение - это значение свойства, которое не было назначено.
  • «undefined» - это тип необъявленной переменной. ( typeof undeclaredVariable == 'undefined'. Попытка прочитать значение недоопределенной переменной приведет к ошибке ReferenceError.)

nullтонко нарушена, потому что typeof null == 'object'. Я не знаю, почему у нас undefinedи null, возможно, какая-то историческая авария.

Шон Макмиллан
источник
2

Ну, undefinedэто дозорное значение, полученное путем оценки чего-то, что не определено в противоположность null, которое является значением, точно определенным, чтобы ничего не представлять .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

Так, например, возвращаемое значение функции, которая не определяет возвращаемое значение, не определено. Значение свойства, не определенного в объекте, не определено. Возвращаемое значение оператора, который не является выражением, не определено (хотя вы не увидите этого, кроме как в консоли).
Обратите внимание, что вы можете создать функцию, которая возвращает явно, undefinedи вы можете явно определить свойство со значением undefinedобъекта, потому что, в конце концов, это допустимое значение. Вы бы сделали это для того, чтобы явно сообщить, что что-то не определено .

Можно подумать о взаимосвязи undefinedи , nullкак между NaNи 0.

back2dos
источник
«Возвращаемое значение функции, которая не определяет возвращаемое значение, не определено», вы имеете в виду, что undefinedэто void?
Саид Нимати
@Saeed: не совсем. voidв JavaScript это унарный оператор , который принимает любой аргумент и возвращает значение undefined .
back2dos