Я всегда думал: nullты установил это пустым, undefinedэто пусто, потому что это не было установлено. Или специально nullпусто, пока undefinedеще пусто. В основном это показывает намерение.
NaN. Посмотреть на себя. console.log (нуль-неопределенный). Разница между нулевым и неопределенным является NaN. (Обратите внимание, что это попытка юмора, прежде чем вы поджарили меня за неправильное понимание вопроса.)
Иван,
Ответы:
1042
В JavaScript undefinedозначает, что переменная была объявлена, но ей еще не присвоено значение, например:
Цитата из книги «Профессиональный JS для веб-разработчиков (Wrox)»: «Вы можете удивиться, почему оператор typeof возвращает« объект »для значения, равного нулю. На самом деле это была ошибка в исходной реализации JavaScript, которая затем была скопирована в ECMAScript. Сегодня Рационализировано, что null считается заполнителем для объекта, хотя технически это примитивная ценность ".
Капитан Разумный
34
переменная также не может быть определена вообще. например: console.log (typeof (abc)); undefined
Нир О.
19
Комментарий от Нир О. очень важен. Если я хочу иметь переменную, которая не имеет значения в начале, я пишу "... = null", например, "myvar = null". Таким образом, когда я набираю "if (myxar == null) {...}", блок if не выполняется. У меня нет этого преимущества с неопределенным: myvar = undefined; myvar = 4; if (typeof myxar == "undefined") {...}
Вольфганг Адамек
11
@ Вольфганг Адамек, безошибочное программирование не о опечатках.
Хорхе Фуэнтес Гонсалес
12
поэтому в основном нулевое значение означает, что переменная была явно установлена как (no value = null) или была инициализирована и определена как ничего. Пока неопределенное значит. это, вероятно, никогда не было инициализировано или, если это было так, оно никогда не было определено.
Неопределенное значение является примитивным значением, используемым, когда переменной не было присвоено значение.
Нулевое значение - это примитивное значение, представляющее пустую, пустую или несуществующую ссылку.
Когда вы объявляете переменную через var и не присваиваете ей значение, оно будет иметь значение undefined. Само по себе, если вы попытаетесь WScript.Echo () или alert () это значение, вы ничего не увидите. Однако, если вы добавите к нему пустую строку, то внезапно появится:
var s;WScript.Echo(s);WScript.Echo(""+ s);
Вы можете объявить переменную, установить для нее значение null, и поведение будет идентичным, за исключением того, что вы увидите распечатку «null» вместо «undefined». Это небольшая разница действительно.
Вы даже можете сравнить переменную, которая не определена, со значением NULL или наоборот, и условие будет истинным:
undefined==nullnull==undefined
Они, однако, считаются двумя различными типами. В то время как undefined является типом для себя самого, null считается значением специального объекта. Это можно увидеть с помощью typeof (), который возвращает строку, представляющую общий тип переменной:
var a;WScript.Echo(typeof(a));var b =null;WScript.Echo(typeof(b));
Запуск вышеуказанного скрипта приведет к следующему выводу:
undefined
object
Независимо от того, являются ли они разными типами, они все равно будут действовать одинаково, если вы попытаетесь получить доступ к члену любого из них, например, то есть они сгенерируют исключение. С WSH вы увидите страшное «varname» - ноль или не объект », и это, если вам повезет (но это тема для другой статьи).
Вы можете явно установить переменную как неопределенную, но я настоятельно рекомендую это сделать. Я рекомендую только устанавливать переменные в null и оставлять неопределенным значение для вещей, которые вы забыли установить. В то же время я настоятельно рекомендую вам всегда устанавливать каждую переменную. JavaScript имеет цепочку областей видимости, отличную от цепочки языков C, легко запутывающую даже опытных программистов, и установка переменных в null - лучший способ предотвратить ошибки на его основе.
Другой случай, когда вы увидите неопределенное всплывающее окно, - это использование оператора удаления. Те из нас, кто живет в С-мире, могут неправильно истолковывать это как уничтожение объекта, но это не так. Эта операция удаляет индекс из массива или элемент из объекта. Для массивов это не влияет на длину, скорее, этот индекс теперь считается неопределенным.
var a =['a','b','c'];delete a[1];for(var i =0; i < a.length; i++)WScript.Echo((i+".) "+a[i]);
Результат приведенного выше сценария:
0.) a
1.)undefined2.) c
Вы также получите неопределенное возвращаемое значение при чтении нижнего индекса или члена, который никогда не существовал.
Разница между null и undefined заключается в следующем: JavaScript никогда не установит ничего на null, обычно это то, что мы делаем. Хотя мы можем установить переменные на неопределенные, мы предпочитаем ноль, потому что это не то, что когда-либо делалось для нас. Когда вы отлаживаете, это означает, что все, что установлено на ноль, принадлежит вам, а не JavaScript. Кроме того, эти два специальных значения почти эквивалентны.
Действительно хороший ответ. Но только для того, чтобы указать, что когда вы отметили "undefined == null", проверка типов не была строгой. Следовательно, оно вернуло «истину». Если вы проверите "undefined === null", он вернет false.
ВИЛВЕН
3
Стоит отметить, что хотя этот комментарий был верным в 11 году, с появлением необязательных параметров функций, появлением систем проверки типов, таких как Flow, и распространенностью React (все из которых обрабатывают неопределенные и нулевые совершенно по-разному), старая мудрость обычно использование null, а не undefined больше не выполняется так строго. undefined на самом деле предпочтительнее нуля во многих случаях, когда вы хотите явно использовать значение по умолчанию (например, для необязательного параметра или необязательного свойства React).
0x24a537r9
66
(добавление символов из-за отсутствия символов, поэтому я могу опубликовать это.)
Не могли бы вы указать атрибуцию источника изображения?
Вега
1
@Vega К сожалению, нет, я не помню, откуда я взял это, кроме как где-то на imgur.com, и это, вероятно, из репоста, а не ОРИГИНАЛЬНОГО источника. Даже встроенная ссылка здесь не дает никакой подсказки о том, кто опубликовал эту версию, поэтому я не могу ее найти.
Себастьян Норр
1
ха-ха-ха ... это лучшее объяснение, которое я когда-либо видел! прохладно!
Акбар Мирсиддиков
36
null - это специальное ключевое слово, которое указывает на отсутствие значения.
думать об этом как о значении, например:
"foo" это строка,
истина булева,
1234 число,
ноль не определено.
Свойство undefined указывает, что переменной не было присвоено значение, включая ноль. подобно
var foo;
определенная пустая переменная имеет nullтип данныхundefined
Оба они представляют значение переменной без значения
ANDnull не представляет строку, которая не имеет значения - пустая строка-
подобно
var a ='';
console.log(typeof a);// string
console.log(a ==null);//false
console.log(a ==undefined);// false
Сейчас если
var a;
console.log(a ==null);//true
console.log(a ==undefined);//true
НО
var a;
console.log(a ===null);//false
console.log(a ===undefined);// true
У каждого есть свой способ использования
undefined используйте его для сравнения типа данных переменной
null использовать его для очистки значения переменной
var a ='javascript';
a =null;// will change the type of variable "a" from string to object
ноль также тип данных. И неопределенные, и нулевые являются типами данных и значениями
danwellman
9
nullАбсолютно является типом данных: msdn.microsoft.com/en-us/library/ie/7wkd9z69(v=vs.94).aspx. Тот факт, что typeof nullвозвращается, objectявляется хорошо известной и задокументированной ошибкой в ранних версиях ECMAScript, которая осталась для обратной совместимости. Ссылка, которую вы фактически разместили в своем комментарии, говорит на полпути вниз по странице "typeof null // object (ошибка в ECMAScript, должна быть нулевой)"! Поэтому, пожалуйста, проявите усилия поиска, прежде чем комментировать
отрицательные
1
Определения противоречат: «отсутствию значения« против »не было присвоено значение». Разве это не то же самое?
Зон
3
Я не согласен с этим ответом. Null и undefined являются разными типами данных. Тип null имеет тип null, а undefined имеет тип undefined. Только при использовании правдивого оператора (==) мы можем увидеть, что javascript говорит, что это правда, но строгое сравнение (===) приводит к ложному.
alaboudi
19
null : отсутствие значения для переменной; undefined : отсутствие самой переменной;
Переменная ..where - это символическое имя, связанное со значением.
JS может быть достаточно любезен, чтобы неявно инициировать вновь объявленные переменные с нулем , но это не так.
var a = {}; a.n = undefined;' then ..a.hasOwnProperty ('n') == true` ... так что отсутствие самой переменной больше не правильно
Мухаммад Умер
17
Пожалуйста, внимательно прочитайте следующее. Это устранит все ваши сомнения относительно различий между нулевым и неопределенным в JavaScript. Также вы можете использовать приведенную ниже функцию полезности для точного определения типов.
В JavaScript у нас могут быть следующие типы переменных.
Необъявленные переменные
Объявленные, но неназначенные переменные
Переменные, назначенные с литералом undefined
Переменные, назначенные с литералом null
Переменные, назначенные с чем-либо, кроме undefined или null
Следующее объясняет каждый из этих случаев один за другим
Необъявленные переменные : для необъявленных переменных верно следующее
Может быть проверено только функцией typeof (), которая возвращает строку undefined
Не может быть проверено с помощью == или === или оператором if или условным оператором ? (выдает ошибку ссылки)
Объявленные, но неназначенные переменные
typeof возвращает строку 'undefined'
== проверка с нулевым возвращает true
== проверить с неопределенным возвращает true
=== проверить с нулевым возвратом false
=== проверить с неопределенными возвращает true
если или условный оператор ? возвращает ложь
Переменные, назначенные с литералом undefined : эти переменные обрабатываются аналогично объявленным, но неназначенным переменным .
Переменные, назначенные с литералом null
typeof возвращает строку «объект»
== проверка с нулевым возвращает true
== проверить с неопределенным возвращает true
=== проверить с нулевым возвращает true
=== проверить с неопределенным возвратом false
если или условный оператор ? возвращает ложь
Переменные, назначенные с чем-либо, кроме undefined или null
typeof возвращает одну из следующих строк: 'string' , 'number' , 'boolean' , 'function' , 'object' , 'symbol'
Ниже приведен алгоритм правильной проверки типа переменной:
Проверьте наличие необъявленного / неназначенного / назначенного с неопределенным с помощью typeof . вернуть, если строка 'undefined' возвращается.
Проверьте на ноль, используя === . верните 'null', если истина .
Проверьте фактический тип, используя typeof . возвращаемый тип, если он не равен «объекту»
Вызовите Object.prototype.toString.call (o), чтобы определить фактический тип объекта. Он должен возвращать строку типа '[object ObjectType]' для всех встроенных объектов Javascript или DOM . Для определенных пользователем объектов возвращается «[Object Object]»
Вы также можете использовать следующую служебную функцию для определения типов. В настоящее время он поддерживает все типы ECMA 262 2017.
Вы можете считать, что undefined представляет системное, непредвиденное или ошибочное отсутствие значения, а null - программный, нормальный или ожидаемое отсутствие значения.
Я объясню undefined, nullи Uncaught ReferenceError:
1 - Uncaught ReferenceError: переменная не была объявлена в вашем скрипте, нет ссылки на эту переменную
2 - undefined: переменная объявлена, но не инициализирована
3 - null: переменная объявлена и является пустым значением
null и undefined - это два разных типа объектов, которые имеют следующие общие черты:
оба могут содержать только одно значение, нулевое и неопределенное соответственно;
оба не имеют свойств или методов, и попытка прочитать какие-либо из этих свойств приведет к ошибке во время выполнения (для всех других объектов вы получите значение undefined, если попытаетесь прочитать несуществующее свойство);
значения нуля и неопределенный считаются равным друг другу и ничего по ==и !=операторами.
Однако на этом сходство заканчивается. На этот раз есть принципиальная разница в том, как реализованы ключевые слова null и undefined . Это не очевидно, но рассмотрим следующий пример:
varundefined="foo";WScript.Echo(undefined);// This will print: foo
undefined , NaN и Infinity - это просто имена предварительно инициализированных «суперглобальных» переменных - они инициализируются во время выполнения и могут быть переопределены обычной глобальной или локальной переменной с теми же именами.
Теперь давайте попробуем то же самое с нулем :
varnull="foo";// This will cause a compile-time errorWScript.Echo(null);
К сожалению! null , true и false являются зарезервированными ключевыми словами - компилятор не позволит вам использовать их в качестве имен переменных или свойств
Другое отличие состоит в том, что undefined является примитивным типом, а null является типом объекта (что указывает на отсутствие ссылки на объект). Учтите следующее:
WScript.Echo(typeoffalse);// Will print: booleanWScript.Echo(typeof0);// Will print: numberWScript.Echo(typeof"");// Will print: stringWScript.Echo(typeof{});// Will print: objectWScript.Echo(typeofundefined);// Will print: undefinedWScript.Echo(typeofnull);// (!!!) Will print: object
Кроме того, есть важное различие в том, как null и undefined обрабатываются в числовом контексте:
var a;// declared but uninitialized variables hold the value undefinedWScript.Echo(a ===undefined);// Prints: -1var b =null;// the value null must be explicitly assigned WScript.Echo(b ===null);// Prints: -1WScript.Echo(a == b);// Prints: -1 (as expected)WScript.Echo(a >= b);// Prints: 0 (WTF!?)WScript.Echo(a >= a);// Prints: 0 (!!!???)WScript.Echo(isNaN(a));// Prints: -1 (a evaluates to NaN!)WScript.Echo(1*a);// Prints: -1.#IND (in Echo output this means NaN)WScript.Echo(b >= b);// Prints: -1 (as expected)WScript.Echo(isNaN(b));// Prints: 0 (b evaluates to a valid number)WScript.Echo(1*b);// Prints: 0 (b evaluates to 0)WScript.Echo(a >=0&& a <=0);// Prints: 0 (as expected)WScript.Echo(a ==0);// Prints: 0 (as expected)WScript.Echo(b >=0&& b <=0);// Prints: -1 (as expected)WScript.Echo(b ==0);// Prints: 0 (!!!)
Нуль становится 0, когда используется в арифметических выражениях или числовых сравнениях - подобно ложному , это в основном просто особый вид «ноль». undefined , с другой стороны, является истинным «ничем» и становится NaN («не числом»), когда вы пытаетесь использовать его в числовом контексте.
Обратите внимание , что нуль и Неопределенные получает специальное лечение от ==и !=операторов, но вы можете проверить истинное числовое равенство и Ь с выражением .(a >= b && a <= b)
Если вы знаете, что переменная - это всего лишь число, в то время как весь жизненный цикл, по соглашению, вы можете инициализировать ее следующим образом 0(или, NaNесли 0это важное значение в вашем использовании):
Если вы знаете, что переменная является только объектом, в то время как весь жизненный цикл, по соглашению, вы можете инициализировать его, чтобы null:
Примечание: разумное использование с нулевым значением должно быть ложной версией Объекта, потому что Объект всегда trueи потому что typeof nullвозвращают object. Это означает, что typeof myVarObjectвозвращаем согласованное значение как для объекта, так и для нулевого типа.
Все
Если вы знаете, что переменная имеет смешанный тип (любой тип в течение всего жизненного цикла), то по соглашению вы можете инициализировать ее, чтобы undefined.
Важно отметить, что while undefinedможет означать, что переменная не была объявлена, но не гарантирует этого. Переменная может быть объявлена как var thing;и будет равна undefined.
Юра
6
Лучший способ понять разницу - это сначала очистить свой разум от внутренней работы JavaScript и просто понять разницу в значении между:
let supervisor ="None"// I have a supervisor named "None"let supervisor =null// I do NOT have a supervisor. It is a FACT that I do not.let supervisor =undefined// I may or may not have a supervisor. I either don't know// if I do or not, or I am choosing not to tell you. It is// irrelevant or none of your business.
Существует разница в значении между этими тремя случаями, и JavaScript различает последние два случая с двумя разными значениями, nullи undefined. Вы можете использовать эти значения явно, чтобы передать эти значения.
Итак, каковы некоторые специфичные для JavaScript проблемы, возникающие из-за этой философской основы?
Объявленная переменная без инициализатора получает значение, undefinedпотому что вы никогда не говорили ничего о том, что было предполагаемым значением.
let supervisor;
assert(supervisor ===undefined);
Свойство объекта, которое никогда не было установлено, оценивается, undefinedпотому что никто никогда ничего не говорил об этом свойстве.
const dog ={ name:'Sparky', age:2};
assert(dog.breed ===undefined);
nullи undefined«похожи» друг на друга, потому что так сказал Брендан Эйх. Но они категорически не равны друг другу.
nullи, к undefinedсчастью, есть разные типы. nullпринадлежит типу Nullи undefinedтипу Undefined. Это в спецификации, но вы никогда не узнаете об этом из-за typeofстранности, которую я не буду повторять здесь.
Функция, достигающая конца своего тела без явного оператора return, возвращается, undefinedтак как вы ничего не знаете о том, что она возвратила.
Кстати, в JavaScript есть и другие формы "небытия" (хорошо бы изучать философию ....)
NaN
Использование переменной, которая никогда не была объявлена, и получение ReferenceError
Использование letили constопределение локальной переменной во временной мертвой зоне и получениеReferenceError
Пустые ячейки в разреженных массивах. Да, они даже undefinedне сравниваются ===с неопределенными.
$ node
>const a =[1,undefined,2]>const b =[1,,2]> a
[1,undefined,2]> b
[1,<1 empty item>,2]
Лучший ответ! Большинство ответов игнорируют тот факт, что вы можете определить значение переменной какundefined , как в let supervisor = undefinedслучае.
Дж. Бруни
Спасибо и да, это заблуждение, что что-то есть undefinedтолько в том случае, если оно не было объявлено или ему еще не было присвоено значение, настолько распространено, и людям очень трудно донести информацию (хотя я продолжаю пытаться). Так много людей мусор JavaScript за то, что как nullи undefinedно эти ценности действительно имеют совершенно разный смысл , и по большей части они работают хорошо с их предполагаемыми значениями (ИМХО конечно).
Рэй Тоал
5
В JavasSript есть 5 примитивных типов данных String, Number, Boolean, null и undefined. Я попытаюсь объяснить на некотором простом примере
скажем, у нас есть простая функция
function test(a){if(a ==null){
alert("a is null");}else{
alert("The value of a is "+ a);}}
также в приведенной выше функции if (a == null) совпадает с if (! a)
Теперь, когда мы вызываем эту функцию без передачи параметра а
test(); it will alert "a is null";
test(4); it will alert "The value of a is "+4;
также
var a;
alert(typeof a);
это даст неопределенное; мы объявили переменную, но мы не присваивали ей значения; но если мы напишем
var a =null;
alert(typeof a); will give alert as object
Так что null это объект. таким образом, мы присвоили нулевое значение «а»
Для undefinedтипа, существует один и только одно значение: undefined.
Для nullтипа, существует один и только одно значение: null.
Таким образом, для них обоих метка является как ее типом, так и значением.
Разница между ними. Например:
null это пустое значение
undefined пропущенное значение
Или:
undefined еще не имел значения
null имеет значение и больше не
На самом деле, nullэто специальное ключевое слово , а не идентификатор, и, следовательно, вы не можете рассматривать его как переменную для назначения.
Тем не менее, undefinedэто идентификатор . Однако в non-strictрежиме и strictрежиме вы можете создать локальную переменную с именем undefined. Но это одна ужасная идея!
function foo(){undefined=2;// bad idea!}
foo();function foo(){"use strict";undefined=2;// TypeError!}
foo();
Когда вы объявляете переменную в javascript, ей присваивается значение undefined. Это означает, что переменная не тронута и ей может быть присвоено любое значение в будущем. Это также подразумевает, что вы не знаете значение, которое эта переменная будет содержать во время объявления.
Теперь вы можете явно назначить переменную null . Это означает, что переменная не имеет никакого значения. Например - Некоторые люди не имеют отчества. Поэтому в таком случае лучше присвоить значение null переменной middlename объекта person.
Теперь предположим, что кто-то обращается к переменной middlename вашего объекта person, и она имеет значение undefined. Он не знал бы, забыл ли разработчик инициализировать эту переменную или она не имеет никакого значения. Если оно имеет значение null, то пользователь может легко сделать вывод, что middlename не имеет никакого значения и не является нетронутой переменной.
неопределенные свойства объекта также не определены. Например, «x» не определен для объекта c, и если вы попытаетесь получить доступ к cx, он вернет undefined.
Обычно мы присваиваем значение null переменным, которые не определены.
Тщательная статья Пера Райана Морра на эту тему ...
«Как правило, если вам нужно присвоить ненулевое значение переменной или свойству, передать его функции или вернуть его из функции, то null - почти всегда лучший вариант. Проще говоря, JavaScript использует undefined, и программисты должны использовать ноль. "
И ноль, и неопределенный в JavaScript указывают на отсутствие значения.
var a =null;//variable assigned null valuevar b;// undefined
Несмотря на то, что оба существуют для отсутствия значения, но: Undefined фактически означает, что переменная не инициализирована. Функции, которые ничего не возвращают, и параметры функции, для которых не указано значение, возвращается неопределенное значение. Используйте оператор строгого равенства ===, чтобы различать пустое и неопределенное.
Хорошо, мы можем запутаться , когда мы слышим о nullи undefined, но давайте начнем это просто, они оба falsy и во многом похожи, но странно часть JavaScript, сделать их несколько существенных отличий, например, TypeOfnull это в 'object'то время как TypeOfundefined является 'undefined',
Поскольку typeof возвращает undefined, undefined - это тип, в котором инициализатор указывает на то, что null указывает, что переменная указывает на отсутствие объекта (практически все в Javascript является объектом).
В JavaScript все переменные хранятся в виде пар ключ-значение. Каждая переменная хранится как переменная_имя: переменная_значение / ссылка .
undefined означает, что переменной в памяти дан пробел, но ей не присвоено значение. Рекомендуется не использовать этот тип в качестве задания.
В таком случае, как обозначить, когда вы хотите, чтобы переменная была без значения на более позднем этапе кода? Вы можете использовать тип
null , который также является типом, который используется для определения того же самого, отсутствия значения, но это не то же самое, что и undefined, так как в этом случае у вас фактически есть значение в памяти. Это значение равно нулю
Я хочу добавить очень тонкую разницу между ними, nullи undefinedэто полезно знать, когда вы пытаетесь изучить Vanilla JavaScript (JS) с нуля:
nullявляется зарезервированным ключевым словом в JS, а undefinedявляется переменной глобального объекта среды выполнения, в которой вы находитесь.
При написании кода это различие не идентифицируется как оба, nullи undefinedони всегда используются в RHS оператора JavaScript. Но когда вы используете их в LHS выражения, вы можете легко наблюдать эту разницу. Поэтому интерпретатор JS интерпретирует приведенный ниже код как ошибку:
varnull='foo'
Это дает ниже ошибку:
Uncaught SyntaxError: неожиданный нулевой токен
Хотя приведенный ниже код работает успешно, хотя я не рекомендую делать это в реальной жизни:
varundefined='bar'
Это работает, потому что undefinedэто переменная в глобальном объекте (объект окна браузера в случае JS на стороне клиента)
undefined='bar'на самом деле не присваивает значение undefined(которое является неизменным), оно просто не сбивает с толку ошибку.
Дмитрий Зайцев
1
Разница между undefinedи nullминимальна, но есть разница. Переменная, значение которой undefinedникогда не было инициализировано. Переменная, чье значение nullбыло явно задано значение null, что означает, что переменная была явно установлена, чтобы не иметь значения. Если вы сравните undefinedи nullс помощью null==undefinedвыражения, они будут равны.
Этот ответ вводит в заблуждение ... см. Обсуждение в принятом ответе. Практический результат - null==undefinedэто trueтолько из - за неявной (или эквивалентный термин в JS). Очевидно, null===undefinedэто falseпотому , что использование, когда вы используете ===его, также сравнивает тип .
Гайарад
1
В основном, неопределенный - это глобальная переменная, которую javascript создает во время выполнения, независимо от того, означает ли null, что значение не присвоено переменной (фактически, null сам по себе является объектом).
Давайте возьмем пример:
var x;//we declared a variable x, but no value has been assigned to it.
document.write(x)//let's print the variable x
Неопределенный , что вы получите в качестве вывода.
Сейчас же,
x=5;
y=null;
z=x+y;
и вы получите 5 в качестве выхода. Это основное различие между неопределенным и нулевым
Из этого я действительно узнал, что isNaN(null)возвращается false- что удивило меня.
Дж. Бруни
0
Оба специальных значения подразумевают пустое состояние.
Основное отличие состоит в том, что undefined представляет значение переменной, которая еще не была инициализирована, а null представляет намеренное отсутствие объекта.
Номер переменной определен, однако ему не присваивается начальное значение:
let number;
number;// => undefined
числовая переменная не определена, что ясно указывает на неинициализированную переменную
Та же неинициализированная концепция возникает при доступе к несуществующему свойству объекта:
Поскольку свойство lastName не существует в obj, JavaScript правильно оценивает obj.lastName как неопределенное.
В других случаях вы знаете, что переменная ожидает, чтобы содержать объект или функцию для возврата объекта. Но по какой-то причине вы не можете создать экземпляр объекта. В таком случае ноль является значимым индикатором отсутствующего объекта.
Например, clone () - это функция, которая клонирует простой объект JavaScript. Ожидается, что функция вернет объект:
Однако clone () может быть вызван с необъектным аргументом: 15 или null (или, как правило, примитивное значение, null или undefined). В таком случае функция не может создать клон, поэтому она возвращает ноль - индикатор отсутствующего объекта.
Оператор typeof делает различие между двумя значениями:
Если переменная не инициализирована, то она не определена. undefined не является объектом. Пример: var MyName; console.log (typeof MyName);
Проверьте консольный журнал в инструменте разработки, он будет напечатан как неопределенный.
null - это объект. Если вы хотите, чтобы какая-либо переменная была нулевой, тогда используется значение null. Переменная null существует, но значение неизвестно. Ее следует назначать переменной программно. ноль не инициализируется автоматически.
Пример: var MyName = null; console.log (typeof MyName); Проверьте журнал csole в инструменте разработки, это будет объект.
null
в JavaScript есть значение?null
ты установил это пустым,undefined
это пусто, потому что это не было установлено. Или специальноnull
пусто, покаundefined
еще пусто. В основном это показывает намерение.Ответы:
В JavaScript
undefined
означает, что переменная была объявлена, но ей еще не присвоено значение, например:null
является значением присваивания. Он может быть присвоен переменной как представление без значения:Из предыдущих примеров ясно, что
undefined
иnull
есть два разных типа:undefined
это сам тип (не определен), аnull
является объектом.а также
источник
Я выбрал это отсюда
Когда вы объявляете переменную через var и не присваиваете ей значение, оно будет иметь значение undefined. Само по себе, если вы попытаетесь WScript.Echo () или alert () это значение, вы ничего не увидите. Однако, если вы добавите к нему пустую строку, то внезапно появится:
Вы можете объявить переменную, установить для нее значение null, и поведение будет идентичным, за исключением того, что вы увидите распечатку «null» вместо «undefined». Это небольшая разница действительно.
Вы даже можете сравнить переменную, которая не определена, со значением NULL или наоборот, и условие будет истинным:
Они, однако, считаются двумя различными типами. В то время как undefined является типом для себя самого, null считается значением специального объекта. Это можно увидеть с помощью typeof (), который возвращает строку, представляющую общий тип переменной:
Запуск вышеуказанного скрипта приведет к следующему выводу:
Независимо от того, являются ли они разными типами, они все равно будут действовать одинаково, если вы попытаетесь получить доступ к члену любого из них, например, то есть они сгенерируют исключение. С WSH вы увидите страшное «varname» - ноль или не объект », и это, если вам повезет (но это тема для другой статьи).
Вы можете явно установить переменную как неопределенную, но я настоятельно рекомендую это сделать. Я рекомендую только устанавливать переменные в null и оставлять неопределенным значение для вещей, которые вы забыли установить. В то же время я настоятельно рекомендую вам всегда устанавливать каждую переменную. JavaScript имеет цепочку областей видимости, отличную от цепочки языков C, легко запутывающую даже опытных программистов, и установка переменных в null - лучший способ предотвратить ошибки на его основе.
Другой случай, когда вы увидите неопределенное всплывающее окно, - это использование оператора удаления. Те из нас, кто живет в С-мире, могут неправильно истолковывать это как уничтожение объекта, но это не так. Эта операция удаляет индекс из массива или элемент из объекта. Для массивов это не влияет на длину, скорее, этот индекс теперь считается неопределенным.
Результат приведенного выше сценария:
Вы также получите неопределенное возвращаемое значение при чтении нижнего индекса или члена, который никогда не существовал.
Разница между null и undefined заключается в следующем: JavaScript никогда не установит ничего на null, обычно это то, что мы делаем. Хотя мы можем установить переменные на неопределенные, мы предпочитаем ноль, потому что это не то, что когда-либо делалось для нас. Когда вы отлаживаете, это означает, что все, что установлено на ноль, принадлежит вам, а не JavaScript. Кроме того, эти два специальных значения почти эквивалентны.
источник
(добавление символов из-за отсутствия символов, поэтому я могу опубликовать это.)
источник
null - это специальное ключевое слово, которое указывает на отсутствие значения.
думать об этом как о значении, например:
Свойство undefined указывает, что переменной не было присвоено значение, включая ноль. подобно
определенная пустая переменная имеет
null
тип данныхundefined
Оба они представляют значение переменной без значения
AND
null
не представляет строку, которая не имеет значения - пустая строка-подобно
Сейчас если
НО
У каждого есть свой способ использования
undefined используйте его для сравнения типа данных переменной
null использовать его для очистки значения переменной
источник
null
Абсолютно является типом данных: msdn.microsoft.com/en-us/library/ie/7wkd9z69(v=vs.94).aspx. Тот факт, чтоtypeof null
возвращается,object
является хорошо известной и задокументированной ошибкой в ранних версиях ECMAScript, которая осталась для обратной совместимости. Ссылка, которую вы фактически разместили в своем комментарии, говорит на полпути вниз по странице "typeof null // object (ошибка в ECMAScript, должна быть нулевой)"! Поэтому, пожалуйста, проявите усилия поиска, прежде чем комментироватьnull : отсутствие значения для переменной; undefined : отсутствие самой переменной;
Переменная ..where - это символическое имя, связанное со значением.
JS может быть достаточно любезен, чтобы неявно инициировать вновь объявленные переменные с нулем , но это не так.
источник
var a = {}; a.n = undefined;' then ..
a.hasOwnProperty ('n') == true` ... так что отсутствие самой переменной больше не правильноПожалуйста, внимательно прочитайте следующее. Это устранит все ваши сомнения относительно различий между нулевым и неопределенным в JavaScript. Также вы можете использовать приведенную ниже функцию полезности для точного определения типов.
В JavaScript у нас могут быть следующие типы переменных.
Следующее объясняет каждый из этих случаев один за другим
Необъявленные переменные : для необъявленных переменных верно следующее
Объявленные, но неназначенные переменные
Переменные, назначенные с литералом undefined : эти переменные обрабатываются аналогично объявленным, но неназначенным переменным .
Переменные, назначенные с литералом null
Переменные, назначенные с чем-либо, кроме undefined или null
Ниже приведен алгоритм правильной проверки типа переменной:
Вы также можете использовать следующую служебную функцию для определения типов. В настоящее время он поддерживает все типы ECMA 262 2017.
источник
через JavaScript: полное руководство
источник
Я объясню
undefined
,null
иUncaught ReferenceError
:1 -
Uncaught ReferenceError
: переменная не была объявлена в вашем скрипте, нет ссылки на эту переменную2 -
undefined
: переменная объявлена, но не инициализирована3 -
null
: переменная объявлена и является пустым значениемисточник
Undefined означает, что переменная была объявлена, но не имеет значения:
Null - это задание:
источник
null и undefined - это два разных типа объектов, которые имеют следующие общие черты:
==
и!=
операторами.Однако на этом сходство заканчивается. На этот раз есть принципиальная разница в том, как реализованы ключевые слова null и undefined . Это не очевидно, но рассмотрим следующий пример:
undefined , NaN и Infinity - это просто имена предварительно инициализированных «суперглобальных» переменных - они инициализируются во время выполнения и могут быть переопределены обычной глобальной или локальной переменной с теми же именами.
Теперь давайте попробуем то же самое с нулем :
К сожалению! null , true и false являются зарезервированными ключевыми словами - компилятор не позволит вам использовать их в качестве имен переменных или свойств
Другое отличие состоит в том, что undefined является примитивным типом, а null является типом объекта (что указывает на отсутствие ссылки на объект). Учтите следующее:
Кроме того, есть важное различие в том, как null и undefined обрабатываются в числовом контексте:
Нуль становится 0, когда используется в арифметических выражениях или числовых сравнениях - подобно ложному , это в основном просто особый вид «ноль». undefined , с другой стороны, является истинным «ничем» и становится NaN («не числом»), когда вы пытаетесь использовать его в числовом контексте.
Обратите внимание , что нуль и Неопределенные получает специальное лечение от
==
и!=
операторов, но вы можете проверить истинное числовое равенство и Ь с выражением .(a >= b && a <= b)
источник
ТЛ; др
Используйте
null
для установки переменной вы знаете, что это объект.Используйте
undefined
для установки переменной, тип которой является смешанным.Это мое использование 5 примитивов и типа объекта, и это объясняет разницу между «вариантом использования»
undefined
илиnull
.строка
Если вы знаете, что переменная является только строкой, а весь жизненный цикл, по соглашению, вы можете ее инициализировать, чтобы
""
:Число
Если вы знаете, что переменная - это всего лишь число, в то время как весь жизненный цикл, по соглашению, вы можете инициализировать ее следующим образом
0
(или,NaN
если0
это важное значение в вашем использовании):или
логический
Если вы знаете, что переменная только логическая, в то время как весь жизненный цикл, по соглашению, вы можете инициализировать ее, чтобы
false
:объект
Если вы знаете, что переменная является только объектом, в то время как весь жизненный цикл, по соглашению, вы можете инициализировать его, чтобы
null
:Примечание: разумное использование с нулевым значением должно быть ложной версией Объекта, потому что Объект всегда
true
и потому чтоtypeof null
возвращаютobject
. Это означает, чтоtypeof myVarObject
возвращаем согласованное значение как для объекта, так и для нулевого типа.Все
Если вы знаете, что переменная имеет смешанный тип (любой тип в течение всего жизненного цикла), то по соглашению вы можете инициализировать ее, чтобы
undefined
.источник
null
это специальное значение, означающее «нет значения».null
это специальный объект, потому чтоtypeof null
возвращает «объект».С другой стороны,
undefined
означает, что переменная не была объявлена или ей не было присвоено значение.источник
undefined
может означать, что переменная не была объявлена, но не гарантирует этого. Переменная может быть объявлена какvar thing;
и будет равнаundefined
.Лучший способ понять разницу - это сначала очистить свой разум от внутренней работы JavaScript и просто понять разницу в значении между:
Существует разница в значении между этими тремя случаями, и JavaScript различает последние два случая с двумя разными значениями,
null
иundefined
. Вы можете использовать эти значения явно, чтобы передать эти значения.Итак, каковы некоторые специфичные для JavaScript проблемы, возникающие из-за этой философской основы?
Объявленная переменная без инициализатора получает значение,
undefined
потому что вы никогда не говорили ничего о том, что было предполагаемым значением.Свойство объекта, которое никогда не было установлено, оценивается,
undefined
потому что никто никогда ничего не говорил об этом свойстве.null
иundefined
«похожи» друг на друга, потому что так сказал Брендан Эйх. Но они категорически не равны друг другу.null
и, кundefined
счастью, есть разные типы.null
принадлежит типуNull
иundefined
типуUndefined
. Это в спецификации, но вы никогда не узнаете об этом из-заtypeof
странности, которую я не буду повторять здесь.Функция, достигающая конца своего тела без явного оператора return, возвращается,
undefined
так как вы ничего не знаете о том, что она возвратила.Кстати, в JavaScript есть и другие формы "небытия" (хорошо бы изучать философию ....)
NaN
ReferenceError
let
илиconst
определение локальной переменной во временной мертвой зоне и получениеReferenceError
Пустые ячейки в разреженных массивах. Да, они даже
undefined
не сравниваются===
с неопределенными.источник
undefined
, как вlet supervisor = undefined
случае.undefined
только в том случае, если оно не было объявлено или ему еще не было присвоено значение, настолько распространено, и людям очень трудно донести информацию (хотя я продолжаю пытаться). Так много людей мусор JavaScript за то, что какnull
иundefined
но эти ценности действительно имеют совершенно разный смысл , и по большей части они работают хорошо с их предполагаемыми значениями (ИМХО конечно).В JavasSript есть 5 примитивных типов данных String, Number, Boolean, null и undefined. Я попытаюсь объяснить на некотором простом примере
скажем, у нас есть простая функция
также в приведенной выше функции if (a == null) совпадает с if (! a)
Теперь, когда мы вызываем эту функцию без передачи параметра а
также
это даст неопределенное; мы объявили переменную, но мы не присваивали ей значения; но если мы напишем
Так что null это объект. таким образом, мы присвоили нулевое значение «а»
источник
Для
undefined
типа, существует один и только одно значение:undefined
.Для
null
типа, существует один и только одно значение:null
.Таким образом, для них обоих метка является как ее типом, так и значением.
Разница между ними. Например:
null
это пустое значениеundefined
пропущенное значениеИли:
undefined
еще не имел значенияnull
имеет значение и больше неНа самом деле,
null
это специальное ключевое слово , а не идентификатор, и, следовательно, вы не можете рассматривать его как переменную для назначения.Тем не менее,
undefined
это идентификатор . Однако вnon-strict
режиме иstrict
режиме вы можете создать локальную переменную с именем undefined. Но это одна ужасная идея!источник
Когда вы объявляете переменную в javascript, ей присваивается значение
undefined
. Это означает, что переменная не тронута и ей может быть присвоено любое значение в будущем. Это также подразумевает, что вы не знаете значение, которое эта переменная будет содержать во время объявления.Теперь вы можете явно назначить переменную
null
. Это означает, что переменная не имеет никакого значения. Например - Некоторые люди не имеют отчества. Поэтому в таком случае лучше присвоить значение null переменной middlename объекта person.Теперь предположим, что кто-то обращается к переменной middlename вашего объекта person, и она имеет значение
undefined
. Он не знал бы, забыл ли разработчик инициализировать эту переменную или она не имеет никакого значения. Если оно имеет значениеnull
, то пользователь может легко сделать вывод, что middlename не имеет никакого значения и не является нетронутой переменной.источник
null и undefined оба используются для представления отсутствия некоторого значения.
А инициализируется и определяется.
нуль - это объект в JavaScript
b не определено и неинициализировано
неопределенные свойства объекта также не определены. Например, «x» не определен для объекта c, и если вы попытаетесь получить доступ к cx, он вернет undefined.
Обычно мы присваиваем значение null переменным, которые не определены.
источник
Object.prototype.toString.call(null); // "[object Null]"
Тщательная статья Пера Райана Морра на эту тему ...
«Как правило, если вам нужно присвоить ненулевое значение переменной или свойству, передать его функции или вернуть его из функции, то null - почти всегда лучший вариант. Проще говоря, JavaScript использует undefined, и программисты должны использовать ноль. "
См. Изучение Вечной Бездны Нулевого и Неопределенного
источник
Ссылка: http://www.thesstech.com/javascript/null-and-undefined
источник
Хорошо, мы можем запутаться , когда мы слышим о
null
иundefined
, но давайте начнем это просто, они оба falsy и во многом похожи, но странно часть JavaScript, сделать их несколько существенных отличий, например, TypeOfnull
это в'object'
то время как TypeOfundefined
является'undefined'
,Но если вы проверите их,
==
как показано ниже, вы увидите, что они оба ложные :Также вы можете присвоить
null
свойству объекта или примитиву, в то время как этоundefined
может быть просто достигнуто, не назначая ничего.Я создаю быстрое изображение, чтобы показать различия для вас с первого взгляда.
источник
Поскольку typeof возвращает undefined, undefined - это тип, в котором инициализатор указывает на то, что null указывает, что переменная указывает на отсутствие объекта (практически все в Javascript является объектом).
источник
В JavaScript все переменные хранятся в виде пар ключ-значение. Каждая переменная хранится как переменная_имя: переменная_значение / ссылка .
undefined означает, что переменной в памяти дан пробел, но ей не присвоено значение. Рекомендуется не использовать этот тип в качестве задания.
В таком случае, как обозначить, когда вы хотите, чтобы переменная была без значения на более позднем этапе кода? Вы можете использовать тип null , который также является типом, который используется для определения того же самого, отсутствия значения, но это не то же самое, что и undefined, так как в этом случае у вас фактически есть значение в памяти. Это значение равно нулю
Оба похожи, но использование и смысл разные.
источник
Я хочу добавить очень тонкую разницу между ними,
null
иundefined
это полезно знать, когда вы пытаетесь изучить Vanilla JavaScript (JS) с нуля:null
является зарезервированным ключевым словом в JS, аundefined
является переменной глобального объекта среды выполнения, в которой вы находитесь.При написании кода это различие не идентифицируется как оба,
null
иundefined
они всегда используются в RHS оператора JavaScript. Но когда вы используете их в LHS выражения, вы можете легко наблюдать эту разницу. Поэтому интерпретатор JS интерпретирует приведенный ниже код как ошибку:Это дает ниже ошибку:
Хотя приведенный ниже код работает успешно, хотя я не рекомендую делать это в реальной жизни:
Это работает, потому что
undefined
это переменная в глобальном объекте (объект окна браузера в случае JS на стороне клиента)источник
undefined='bar'
на самом деле не присваивает значениеundefined
(которое является неизменным), оно просто не сбивает с толку ошибку.Разница между
undefined
иnull
минимальна, но есть разница. Переменная, значение которойundefined
никогда не было инициализировано. Переменная, чье значениеnull
было явно задано значениеnull
, что означает, что переменная была явно установлена, чтобы не иметь значения. Если вы сравнитеundefined
иnull
с помощьюnull==undefined
выражения, они будут равны.источник
null==undefined
этоtrue
только из - за неявной (или эквивалентный термин в JS). Очевидно,null===undefined
этоfalse
потому , что использование, когда вы используете===
его, также сравнивает тип .В основном, неопределенный - это глобальная переменная, которую javascript создает во время выполнения, независимо от того, означает ли null, что значение не присвоено переменной (фактически, null сам по себе является объектом).
Давайте возьмем пример:
Неопределенный , что вы получите в качестве вывода.
Сейчас же,
и вы получите 5 в качестве выхода. Это основное различие между неопределенным и нулевым
источник
null - это значение присваивания, которое используется с переменной для представления значения (это объект).
undefined - это переменная, которой не присвоено никакого значения, поэтому JavaScript назначит ей неопределенное значение (это тип данных).
undeclared - если переменная вообще не создается, она называется undeclared.
источник
Проверь это. Результат стоит тысячи слов.
Смотрите также:
Ура!
источник
isNaN(null)
возвращаетсяfalse
- что удивило меня.Оба специальных значения подразумевают пустое состояние.
Основное отличие состоит в том, что undefined представляет значение переменной, которая еще не была инициализирована, а null представляет намеренное отсутствие объекта.
В других случаях вы знаете, что переменная ожидает, чтобы содержать объект или функцию для возврата объекта. Но по какой-то причине вы не можете создать экземпляр объекта. В таком случае ноль является значимым индикатором отсутствующего объекта.
Например, clone () - это функция, которая клонирует простой объект JavaScript. Ожидается, что функция вернет объект:
Однако clone () может быть вызван с необъектным аргументом: 15 или null (или, как правило, примитивное значение, null или undefined). В таком случае функция не может создать клон, поэтому она возвращает ноль - индикатор отсутствующего объекта.
источник
В дополнение к другому значению есть и другие различия:
null
но опускаетundefined
источник
Если переменная не инициализирована, то она не определена. undefined не является объектом. Пример: var MyName; console.log (typeof MyName);
Проверьте консольный журнал в инструменте разработки, он будет напечатан как неопределенный.
null - это объект. Если вы хотите, чтобы какая-либо переменная была нулевой, тогда используется значение null. Переменная null существует, но значение неизвестно. Ее следует назначать переменной программно. ноль не инициализируется автоматически.
Пример: var MyName = null; console.log (typeof MyName); Проверьте журнал csole в инструменте разработки, это будет объект.
источник