В JavaScript есть два значения, которые в основном говорят "Я не существую" - undefined
и null
.
Свойство, которому программист ничего не назначил, будет undefined
, но для того, чтобы свойство стало null
, ему должно быть явно присвоено null
.
Я подумал, что существует необходимость в null
, потому что undefined
является примитивным значением и null
объектом. Это не так, даже если typeof null
даст 'object'
: на самом деле оба являются примитивными значениями - это означает, что из функции конструктора нельзя возвращать undefined
и null
, поскольку оба будут преобразованы в пустой объект (один должен выдать ошибку для объявления отказа в конструкторах).
Они также оценивают значение false
в булевых контекстах. Единственное реальное различие, о котором я могу думать, состоит в том, что вы оцениваете значение NaN
, а другое - в 0
в числовых контекстах.
Итак, почему существуют undefined
и null
, если это просто путает программистов, которые неправильно проверяют null
при попытке выяснить, установлено ли свойство или нет?
edit: Я хотел бы знать, есть ли у кого-нибудь разумный пример, где нужно использовать null
, который не может быть выражен с помощью undefined
.
edit2 + 3. Таким образом, общий консенсус, по-видимому, заключается в том, что undefined
означает "нет такого свойства", а null
означает, что свойство существует, но не имеет значения ".
Я мог бы с этим справиться, если бы реализация JavaScript действительно обеспечивала выполнение этого поведения, но undefined
является вполне допустимым примитивным значением, поэтому его можно легко присвоить существующим свойствам для разрыва этого контракта. Поэтому, если вы хотите убедиться, что существует свойство, вы должны использовать оператор in
или hasOwnProperty()
в любом случае. Итак, еще раз: какое практическое использование для отдельных значений для undefined
и null
?
Я использую undefined
, когда хочу отключить значения свойств, которые больше не используются, но которые я не хочу использовать delete
. Должен ли я использовать null
вместо этого?