В JavaScript есть два значения, которые в основном говорят: «Меня не существует» - undefined
и null
.
Свойство, которому программист ничего не назначил, будет undefined
, но для того, чтобы свойство стало возможным null
, оно null
должно быть явно присвоено ему.
Однажды я подумал, что нужна примитивная ценность и объект, null
потому что это необходимо . Это не так, даже если приведет к получению : на самом деле, оба являются примитивными значениями - что означает, что ни одно из них не может быть возвращено из функции-конструктора, поскольку оба будут преобразованы в пустой объект (необходимо выдать ошибку, чтобы объявить сбой в конструкторах).undefined
null
typeof null
'object'
undefined
null
Они оба вычисляют значение false
в логических контекстах. Единственная реальная разница, о которой я могу думать, это то, что один оценивает NaN
, а другой - 0
в числовом контексте.
Итак, почему есть и то, undefined
и другое, и null
если это просто сбивает с толку программистов, которые неправильно проверяют, null
пытаясь выяснить, установлено ли свойство или нет?
Я хотел бы знать, есть ли у кого-нибудь разумный пример, в котором необходимо использовать, null
который нельзя выразить с помощью undefined
.
Таким образом, общее мнение, по-видимому, сводится к тому, что undefined
«такого свойства нет», а null
значит «свойство существует, но не имеет ценности».
Я мог бы смириться с этим, если бы реализации JavaScript фактически обеспечивали такое поведение, но undefined
это совершенно допустимое примитивное значение, поэтому его можно легко назначить существующим свойствам, чтобы разорвать этот контракт. Поэтому, если вы хотите убедиться, что свойство существует, вы должны использовать in
оператор или в hasOwnProperty()
любом случае. Итак, еще раз: в чем практический смысл отдельных значений для undefined
и null
?
На самом деле я использую, undefined
когда хочу сбросить значения свойств, которые больше не используются, но которых я не хочу delete
. Должен ли я использовать null
вместо этого?
источник
undefined
.In JavaScript, there are two values which basically say 'I don't exist' - undefined and null.
Нет, только такundefined
говорит.Ответы:
На самом деле вопрос не в том, «почему в JS есть нулевое значение» - в большинстве языков есть какое-то нулевое значение, и оно обычно считается очень полезным.
Вопрос в том, «почему в JS есть неопределенное значение». Основные места, где он используется:
var x;
но не назначаете его,x
содержит undefined;null
наверняка сработало бы так же хорошо для (1) и (2) *. (3) действительно должен сразу генерировать исключение, и тот факт, что он этого не делает, вместо того, чтобы возвращать этот странныйundefined
сбой позже, является большим источником трудностей отладки.*: вы также можете утверждать, что (2) должен вызывать исключение, но тогда вам придется предоставить лучший, более явный механизм для аргументов по умолчанию / переменных.
Однако в JavaScript изначально не было исключений или какого-либо способа спросить объект, есть ли у него член под определенным именем - единственный способ был (и иногда остается) получить доступ к члену и посмотреть, что вы получите. Учитывая, что у этого
null
уже была цель, и вы вполне могли захотеть установить для нее член, требовалось другое внеполосное значение. Итак, у нас естьundefined
, как вы указываете, это проблематично, и это еще одна замечательная «функция» JavaScript, от которой мы никогда не сможем избавиться.Да. Сохранить
undefined
как специальное значение для сигнализации, когда другие языки могут вместо этого генерировать исключение.null
обычно лучше, за исключением некоторых интерфейсов IE DOM, где установка чего-либоnull
может вызвать ошибку. Часто в этом случае работает пустая строка.источник
in
оператора илиhasOwnProperty
? Потому что они намного безопаснее, чемobj.hello !== undefined
для проверки наличия свойства у объекта.Лучше всего описано здесь , но вкратце:
undefined - это отсутствие типа и значения, а null - отсутствие значения.
Более того, если вы делаете простые сравнения «==», вы правы, они выходят одинаково. Но попробуйте ===, который сравнивает тип и значение, и вы заметите разницу.
источник
null !== undefined
- мой вопрос заключался в том, почему возникла необходимость в двух вещах, выражающих одну и ту же смысловую концепцию; Кроме того, в вашей ссылке упоминается, что «null - это объект» - это неправильно, это примитив ...typeof
ложь - прочтите спецификацию или попробуйте вернутьсяnull
из конструктораnull
или42
, отбросьте возвращаемое значение и вместо этого верните вновь созданный объектЯ не думаю, что есть какая-то причина иметь и то
null
и другоеundefined
, потому что единственная причина, по которой многие люди предлагали («undefined
означает, что такой переменной / свойства нет»), недействительна, по крайней мере, в JavaScript.undefined
не могу сказать вам, существует ли переменная / свойство или нет.Как видите, проверка
foo === undefined
не говорит вам,foo
существует ли , и настройка наobj.bar = undefined
самом деле не удаляетbar
.Это может быть изначальное намерение автора JavaScript, которое
undefined
должно представлять «небытие». Однако реализация оказалась не такой.источник
undefined
наnull
в приведенных выше примерах кода, и все ответы будут одинаковыми. Я не знаю, как это ответить на вопрос. Было ли это означать комментарий к чьему-то ответу?null
и другоеundefined
, потому что единственная причина, по которой многие люди предложили, неверна.undefined
. Но если вы назначилиundefined
его, на самом делеundefined
это не так - он был определенundefined
и имеет ссылку на него. Единственная разница междуundefined
иnull
заключается в их использовании и исторической цели. Оба они атомарны.И то и другое вполне возможно. Например, если вы запрашиваете WMI, вполне возможно, чтобы свойства класса возвращали нулевое значение. Они определены, просто в то время они имеют значение null.
источник
Я думаю, что ваш вывод о том, что JavaScript определяет
undefined
как «такого свойства нет» иnull
как «свойство не имеет значения», является совершенно правильным. И для такого динамичного языка, как JavaScript, это очень важное различие. Использование утки означает, что нам нужно различать свойство, которое не существует, и свойство, не имеющее значения. Это наш основной способ получения информации о типе. в статически типизированном языке существует явное различие между пустым полем и несуществующим полем. В JavaScript это ничем не отличается. Однако он проверяется во время выполнения и может быть изменен до этого времени.Я должен согласиться с тем, что реализация странная, поскольку большую часть времени различия стираются. Однако я думаю, что в JavaScript различие важно. И уметь назначать
undefined
очень важно.Я помню, как недавно читал в блоге об онлайн-ролевой игре, написанной на JavaScript. В нем использовались примеры, в которых объекты создавались как копии существующих экземпляров, а не как прототипы (классы, функции и т. Д.), А затем были изменены. Это действительно помогло мне понять, насколько мощным это
undefined
может быть при изменении существующих объектов, но я не могу вспомнить, кто это написал.источник
Семантически они означают разные вещи. Тип null имеет ровно одно значение в своем домене, null, и это конкретное значение может быть присвоено свойству. Неопределенный представляет собой явное отсутствие какого-либо присвоенного значения.
источник
undefined
для назначения свойств, поэтому этот контракт (только возврат,undfined
если такого свойства нет) может быть легко нарушен программистом ...Как программист на Java, я вижу огромную разницу между undefined и null. Кодирование JavaScript не так много, потому что JavaScript не является строго типизированным, а различия между undefined и null стираются из-за автоматических преобразований, которые часто выполняются во время выполнения. Кстати, я часто пользуюсь этими преобразованиями; они делают мой JS-код более компактным и читаемым.
Чтобы ответить на ваш вопрос, undefined означает, что значение никогда не устанавливалось. На практике это обычно указывает на ошибку. Если yourObject.property не определен, это означает, что вы по какой-то причине не установили свойство, или я ищу то, чего вообще не существует. Это настоящая проблема при работе над проектом с более чем одним кодировщиком.
null означает, что "нет значения" явно задано. Фактически, вы рассказываете мне что-то об этом свойстве, возможно, что оно не используется в данном контексте или что значение еще не определено.
В Java попытки доступа к неопределенному полю всегда приводят к исключению. Фактически, компилятор может предупреждать вас об этом в вашем коде.
источник
Попробуйте этот пример:
Я думаю, что здесь есть реальное применение двум различным типам.
источник
obj.userid = undefined
, он не удастся - см. последнее изменение моего вопросаВсе сводится к динамической природе javascripts.
Вещи могут быть неопределенными, чтобы их можно было добавить позже. Возможно, поэтому javascript такой мощный и расширяемый.
источник
это важная языковая функция, если вы обертываете свою программу вокруг четной парадигмы javascript.
это очень полезно, если вы имеете дело с набором данных, которым требуется значение, представляющее «ничего», чтобы указать какое-либо действие, отличное от использования «ничего» для указания действия по умолчанию.
в приведенном выше коде ключевое слово null и неопределенный сервер очень понятны и предназначены для разных целей. поиск, который не найден в объекте filter_func_pt, который возвращает undefined, означает добавить свойство к возвращаемому объекту как есть, тогда как нулевое значение указывает, что значение должно быть удержано, а не добавлено, и наличие любого истинного значения в этом case представляет функцию, используемую для преобразования значения перед добавлением его в объект ret .
источник
null прекрасен
как и все другие типы Live Script.
Почему вы хотите говорить неправильные вещи ?!
«null» - это «пустой объект», так же как «0» - «пустое число» . 0 - это ничто, но существует как Тип числа. null, конечно, тоже пуст, но «он есть», и это четко определенная вещь объектного типа .
Об этих вещах принято говорить как о «типах», хотя это не так. Фактически это «категории». Но теперь все кончено.
Так что буду придерживаться его, чтобы сказать, что «null» - это тип объекта без вида. А «null» говорит: «Я очень много существую [!], Но у меня нет контента моего типа».
В то время как undefined не хватает как типа, так и вида, где undefined также является его определением типа. Неопределенный тип типа становится его отличительной типологией. Что-то вроде вопроса [существует ли «ничего» и как вы определяете «ничего»?].
Вы умудрились в очередной раз сказать неверную вещь. Конечно, нет, «undefined» - это не объект, это простой токен, который мы, люди, понимаем; но вопреки этому null - и он говорит вам, что: его Тип правильный, но Тип, который вы ищете, не содержится в нем или, по крайней мере, в настоящее время. Приходите к нам позже, когда мы поставим \ присвоим ему какой-нибудь объект \.
В этом вся суть их основного различия, как уже упоминалось: undefined - это простой токен, и поскольку он состоит из того же «генетического» материала, что и его дальние родственники: строки, операция [+ undefined] преобразует его в NaN, аналогично null, конечно, вместо этого превратится в правильный тип 0 \ Number, и в отличие от undefined , который превратится в строку (! Которая не пуста!), И именно поэтому вместо этого она дает NaN . Где: + undefined >> + "undefined" >> NaN. Поскольку числовой контекст ожидает явного значения.
В то время как логический контекст ожидает ссылку, не находит ничего для преобразования и выдает false.
Давай прорежем сейчас ...
Я постараюсь привести только два эмпирических примера и надеюсь, что их хватит.
// означает - свойство существует; его ожидаемое значение имеет тип: Object , и этот oElement поддерживает событие «onclick»!
// означает - свойство существует; его ожидаемое значение имеет тип: String , что означает, что oElement поддерживает свойство «innerText».
в обоих случаях - если вы получили «undefined», это означает, что свойство не существует; не поддерживается или имеет неправильную реализацию (поставщик ua).
Оставайся на морозе и получай удовольствие.
источник
после прочтения удивительного обсуждения undefined и null, небольшой поиск в Google привел меня к Mozilla Documentations https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null, это упоминается - null часто извлекается в месте, где можно ожидать объект, но ни один объект не имеет значения.
Не похож на шаблон объекта Null https://en.wikipedia.org/wiki/Null_object_pattern
Итак, я думаю, имеет смысл иметь тип данных Null.
Документация также упоминается как typeof null // "объект" (не "null" по устаревшим причинам)
Не уверен, какие унаследованные причины
источник