Подтвердить что ты не робот

В чем разница в Javascript между "undefined" и "not defined"?

Если вы попытаетесь использовать переменную, которая не существует и не была объявлена, javascript выдает ошибку. var name is not defined, а script остановится тогда и там.

Но если вы проверите его с помощью typeof noname, он вернет "undefined". Я всегда думал, что вам нужно объявить var, чтобы он имел тип. Либо используя: var a; поэтому он имеет тип undefined или задает значение типа: var b =5;, поэтому он имеет тип своего значения.

В чем же разница между var a; и var b = undefined;?

4b9b3361

Ответ 1

Необъявленная переменная (т.е. та, которая не существует) не имеет типа - и поэтому ее тип undefined. Я считаю, что общепринятым способом проверки, если что-то есть undefined, является

typeof var === 'undefined'

а не

var === undefined

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

Убедитесь, что вы используете оператор triple-equals, хотя, если вы используете второй вариант; оператор (более обычный) double-equals выполняет принуждение типа, поэтому null == undefined истинно, а null === undefined - false. Иногда вам может понадобиться первое поведение, хотя часто вам нужно второе, особенно если вы тестируете против undefined, поэтому важно распознать разницу. (Это еще одно преимущество первого случая, так как невозможно сделать эту тонкую ошибку).

Да, переменные могут иметь значение undefined, и вы можете явно назначать им значения. Присвоение переменной undefined переменной, хотя, вероятно, запутанной, так как это немного парадокс (вы определили переменную как undefined), и невозможно отличить эту переменную от любых переменных, которые не существуют или неинициализированные переменные, Используйте значение null, если вы хотите указать, что переменная не имеет значения в настоящее время, или если вы хотите вообще "уловить" переменную, используйте delete {varname}. Присвоение переменной undefined переменной не удаляет это объявление переменной; и он по-прежнему будет отображаться в списке свойств объекта, если вы перебираете их, поэтому я не могу придумать ни одной ситуации, которая вам пригодится.

Изменить: в ответ на комментарий при сравнении значений с === (или ==) переменная должна быть отсрочена, чтобы получить ее текущее значение, чтобы выполнить сравнение. Поскольку переменная не существует, это разыменование не удаётся (никаких реальных сюрпризов пока нет). Хотя вы можете ожидать, что оператор typeof будет работать аналогичным образом (получите текущее значение, посмотрите, что это за тип), он специально работает с переменными undefined. "Краткая версия" (как используется ссылка на Mozilla) просто заключается в том, что "Оператор typeof возвращает строку, указывающую тип неоцененного операнда."

Длинная версия, извлеченная из ECMAScript spec, заключается в том, что существует специальный случай для переменных undefined:

11.4.3 typeof UnaryExpression оценивается следующим образом:

  • Оценить UnaryExpression (в соответствии с 10.1.4 это возвращает "значение типа Reference, базовый объект которого имеет значение null и чье имя свойства является идентификатором", если переменная не объявлена).
  • Если тип (результат (1)) не является ссылкой, перейдите к шагу 4. (Это ссылка)
  • Если GetBase (результат (1)) равно null, верните "undefined". (Это специальный случай, соответствующий переменным undefined)

Что касается вашего комментария к первому вопросу, "как вы можете классифицировать то, чего не существует" - это легко! Просто разделите все понятия на вещи, которые существуют (например, белка, камень), а также те, которые не существуют (единороги, приводы варпа). То, что означает undefined; независимо от его семантики на английском языке, его значение Javascript заключается в том, что переменная еще не была объявлена ​​или заселена, и, хотя понятие "переменная, называемое foo", действительно существует, нет переменной с этим именем, имеющим реальное значение.

Ответ 2

JavaScript предоставляет несколько разных понятий пропущенных или пустых переменных (и свойств объекта):

  • Переменные, которые на самом деле "не определены", т.е. они не существуют как заданное имя, не связаны в текущей лексической среде. Доступ к такой переменной вызовет ошибку, но использование typeof не будет и вернет 'undefined'. Напротив, доступ к несуществующим свойствам не приведет к ошибке и возвратит undefined (и вы можете использовать оператор in или метод hasOwnProperty(), чтобы проверить, действительно ли существуют свойства).

  • Существующие переменные, которым не присвоено значение (которое является общим из-за var hoisting) или которые были явно установлены на undefined. Доступ к такой переменной вернется undefined, typeof вернет 'undefined'.

  • Существующие переменные, которые явно установлены на null. Доступ к такой переменной вернется null, typeof вернет 'object'. Обратите внимание, что это вводит в заблуждение: null не является объектом, а примитивным значением типа Null (что приводит к тому, что вы не можете вернуть null из функций конструктора - вместо этого вы должны указать ошибку).

Я бы рекомендовал следующие практики:

  • Используйте typeof для проверки undefined, поскольку он будет охватывать первые два случая.
  • Не назначайте свойства undefined: используйте delete, чтобы избавиться от них; обратите внимание, что вы не можете удалить переменные (но также обратите внимание, что глобальные переменные являются фактически свойствами глобального объекта и, следовательно, могут быть удалены).
  • Используйте null, чтобы отметить отсутствие значимого значения (например, прямую ссылку последнего node связанного списка) или если вы хотите очистить переменную как подсказку сборщику мусора.

Вы можете пойти с undefined для 3. также и никогда не использовать null вообще.

Ответ 3

Я считаю, что разница между определением JavaScript и firebugs одной и той же вещи.

Undefined - это просто состояние того, что не было определено как значение. Поэтому он не имеет типа.

В чем же разница между var a; и var b = undefined;

var a; alert(a); // undefined
a; alert(a); // "Error "a" not defined"
a = undefined; alert(a); // undefined

Второй пример недействителен JavaScript-код, и выполнение остановится. Так как это ошибка.

Ответ 4

alert(a);

Ответ 5

undefined: объявлено, но значение не выровнено выше, если мы обращаемся к нему в том слове, в котором оно существует, но значение не присвоено

" не определено ": это ошибка, которая указывает кодеру/программисту/пользователю, что переменная не существует в области видимости. Не объявлять по объему.

var a = 1;
console.log(a) //1

var b;
console.log(b) //undefined

console.log(c) //undefined
var c=2;

console.log(d) //undefined
var d;

e=3
console.log(e) //3
var e;

console.log(f) //Uncaught ReferenceError: f is not defined
> Note: the default behavior of javaScript moving declarations to the
> top
>So the above code is look like below internally
var a = 1, b, c, d, e;
console.log(a) //1

console.log(b) //undefined

console.log(c) //undefined
c=2;

console.log(d) //undefined

e=3
console.log(e) //3

console.log(f) //Uncaught ReferenceError: f is not defined

Ответ 6

Неразъявленная переменная не существует в Javascript-памяти, а заявленная - и может быть установлена ​​на undefined.

Разница вызвана смешением дизайна Javascript. Если значение переменной undefined, то оно должно быть удалено. В действительности значения фальши, такие как 0, "", нуль и undefined, в основном бессмысленны и идентичны. Много времени тратится на них. Они все ничего и не существуют. Очень противоречиво иметь более одного типа ничего, или, возможно, позволить даже одному.

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

Ответ 7

Не определен:

Переменная не объявлена или не инициализирована. Выдает ошибку ссылки

Пример:

console.log(newvariable); // results: ReferenceError: newvariable is not defined

Не определено:

Переменная, объявленная без значения, будет иметь значение undefined.

Пример:

var newVar;
console.log(newVar); // results: undefined