Я пишу JavaScript довольно давно, и у меня никогда не было причин его использовать null
. Кажется, что undefined
это всегда предпочтительнее и программно служит той же цели. Какие практические причины использовать null
вместо undefined
?
javascript
null
undefined
Джимми Куадра
источник
источник
document.getElementById()
которые могут возвращать,null
но нетundefined
, поэтому в таких случаях зачем вам тестировать возвратundefined
? (Конечно, это сработает, если вы используете==
вместо===
, но все же, почему вы намеренно проверяете не то, что нужно?)document.getElementById('does-not-exist')
). Поvar a;
умолчанию переменные и возвращаемые значения функций не определены. В прошлом null был в глобальной области видимости, поэтому его использование замедляло выполнение и заставляло меня предпочитать другие ложные типы (false, '', 0) свободным ссылкам. Я лично избегаю null, если нет веской причины, потому что я считаю его проще, что в целом лучше.Ответы:
Null и undefined - это два разных значения, которые означают одно и то же. Единственное отличие состоит в конвенциях о том , как использовать их в вашей системе. Как уже упоминалось, некоторые люди используют null для обозначения «нет объекта», когда вы иногда можете получить объект, а undefined означает, что объект не ожидался (или что произошла ошибка). Моя проблема в том, что это совершенно произвольно и совершенно ненужно.
Тем не менее, есть одно существенное отличие - переменные, которые не инициализированы (включая параметры функции, где не был передан аргумент, среди прочего), всегда не определены.
Вот почему в моем коде я никогда не использую null, если что-то, что я не контролирую, возвращает null (например, соответствие регулярных выражений). Прелесть этого в том, что это многое упрощает. Мне никогда не нужно проверять x === undefined || х === ноль. И если вы привыкли использовать == или просто такие вещи, как if (x) .... Прекрати.
!x
будет оценивать значение true для пустой строки, 0, null, NaN - то есть вещей, которые вам, вероятно, не нужны. Если вы хотите написать неплохой javascript, всегда используйте тройное равное === и никогда не используйте null (вместо этого используйте undefined). Это облегчит тебе жизнь.источник
===
или!==
. JS - фантастически выразительный язык, если вы знаете, как им пользоваться.null
/undefined
была необходима, потому что в начальной версии JS не было оператораhasOwnProperty
илиin
. Теперь, когда это произошло, я действительно не понимаю, почему одно из них не было отменено в ES6 или каких-либо предложениях ES7, которые я видел.На самом деле у меня нет ответа, но, по словам Николаса Закаса , страница 30 его книги « Профессиональный JavaScript для веб-разработчиков » :
источник
undefined
означает катастрофу. Просто имхо.var myVar;
и явно проверить значение,undefined
чтобы определить, была ли она заполнена ссылкой на объект позже. Я считаю, что это чисто академический подход - вы можете делать это в любом случае, и любой, кто советует один способ, а не другой, просто продвигает свои собственные правила.undefined
иnull
. Это все еще очень раздражает. Я избегаю присваивать переменнуюnull
только для того, чтобы уменьшить количество дополнительныхnull
тестов.==
сравнение (в отличие от===
) имеет смысл:v == null
(илиv == undefined
) будет проверять наличие null или undefined.В конце концов, поскольку оба
null
иundefined
приводят к одному и тому же значению (Boolean(undefined) === false && Boolean(null) === false
), вы можете технически использовать любой из них для выполнения работы. Однако есть правильный путь, ИМО.Оставьте использование
undefined
компилятору JavaScript.undefined
используется для описания переменных, которые не указывают на ссылку. Это то, что компилятор JS позаботится о вас. Во время компиляции движок JS установит значение всех поднятых переменных вundefined
. По мере того, как движок выполняет код и значения становятся доступными, движок присваивает соответствующие значения соответствующим переменным. Для тех переменных, для которых не было найдено значений, переменные будут продолжать поддерживать ссылку на примитивundefined
.Используйте null только в том случае, если вы явно хотите обозначить значение переменной как «не имеющее значения».
Как утверждает @ com2gz:
null
используется для определения чего-то программно пустого.undefined
означает, что ссылка не существует.null
Значение имеет определенную ссылку на «ничего». Если вы вызываете несуществующее свойство объекта, вы получитеundefined
. Если я намеренно сделаю это свойство пустым, то это должно бытьnull
так, чтобы вы знали, что это сделано намеренно.TL; DR; Не используйте
undefined
примитив. Это значение, которое компилятор JS автоматически установит для вас, когда вы объявляете переменные без присваивания или если вы пытаетесь получить доступ к свойствам объектов, для которых нет ссылки. С другой стороны, используйтеnull
тогда и только тогда, когда вы намеренно хотите, чтобы переменная не имела значения.Я никогда явно не устанавливал что-либо на undefined (и я не встречал этого во многих кодовых базах, с которыми я взаимодействовал). Также редко пользуюсь
null
. Я использую только один разnull
, когда хочу обозначить значение аргумента функции как не имеющее значения, то есть:источник
undefined там, где не существует понятия о вещи; у него нет типа, и на него никогда раньше не ссылались в этой области; null - это место, где известно, что вещь существует, но она не имеет ценности.
источник
У каждого свой способ кодирования и собственная внутренняя семантика, но с годами я обнаружил, что это самый интуитивный совет, который я даю людям, задающим этот вопрос: в случае сомнений делайте то, что делает JavaScript .
Допустим, вы работаете со свойствами объекта, такими как параметры для плагина jQuery ... спросите себя, какое значение JavaScript дает свойство, которое еще не определено - ответ будет
undefined
. Поэтому в этом контексте я бы инициализировал эти типы вещей с помощью undefined, чтобы они соответствовали JavaScript (для переменных вы можете использоватьvar myVar;
вместоvar myVar = undefined;
).Теперь предположим, что вы выполняете манипуляции с DOM ... какое значение JavaScript присваивает несуществующим элементам? Ответ есть
null
. Это значение, которое я бы инициализировал, если вы создаете переменную-заполнитель, которая позже будет содержать ссылку на элемент, фрагмент документа или подобное, относящееся к DOM.Если вы работаете с JSON, необходимо сделать особый случай: для неопределенных значений свойств вы должны либо установить их на,
""
либоnull
потому что значениеundefined
не считается правильным форматом JSON.С учетом вышесказанного, как было сказано на предыдущем постере, если вы обнаружите, что инициализируете материал с помощью
null
илиundefined
более одного раза в синей луне, то, возможно, вам следует пересмотреть, как вы собираетесь кодировать свое приложение.источник
Вы можете принять предложенное здесь соглашение, но на самом деле для этого нет веских причин. Он не используется достаточно часто, чтобы иметь смысл.
Чтобы соглашение было полезным, вы сначала должны знать, что вызываемая функция следует соглашению. Затем вам нужно явно протестировать возвращаемое значение и решить, что делать. Если вы получили значение undefined , вы можете предположить, что произошла какая-то ошибка , о которой знала вызываемая функция . Но если произошла ошибка, и функция знала об этом, и полезно отправить ее в более широкую среду, почему бы не использовать объект ошибки? т.е. вывести ошибку?
Итак, в конце концов, соглашение практически бесполезно ни для чего, кроме очень маленьких программ в простых средах.
источник
Полезное свойство в null, которое undefined не квалифицирует:
Я использую,
null
когда хочу «выключить» числовое значение или инициализировать некоторые. Мое последнее использование манипулировало преобразованием css:Не уверен, стоит ли мне использовать эту собственность, подумал ...
источник
Узлы и элементы DOM не являются неопределенными, но могут иметь значение NULL.
NextSibling последнего дочернего элемента имеет значение NULL.
Предыдущий брат первого потомка равен нулю.
Ссылка document.getElementById имеет значение NULL, если элемент не существует в документе.
Но ни в одном из этих случаев значение не определено ; там просто нет узла.
источник
window.myVar
вернет undefined, если она не существует. Есть масса вещей, которые возвращают «undefined» в JavaScript, просто есть множество вещей, которые возвращают «null» - все зависит от контекста.Некоторые сказали, что можно инициализировать объекты
null
. Я просто хотел указать, что значения по умолчанию для аргументов деструктуризации не работаютnull
. Например:Это требует выполнения
null
проверок перед вызовом функции, что может происходить часто.источник
Я работаю над этим вопросом прямо сейчас и смотрю на следующую философию:
Для меня этот вопрос важен, потому что у любого, вызывающего функцию, которая возвращает результат, не должно возникать вопросов о том, следует ли проверять undefined или null.
Этот ответ не пытается адресовать:
На мой взгляд, переменные - это ваш собственный бизнес, а не часть вашего API, а свойства в любой объектно-ориентированной системе определены и, следовательно, должны быть определены со значением, отличным от того, что они были бы, если бы не были определены (null для определенного, undefined - это то, что вы получить при доступе к чему-то, чего нет в вашем объекте).
источник
Причина:
var undefined = 1
допустим, javascript, ноvar null = 1
есть синтаксическая ошибка. Разница в том, чтоnull
это ключевое слово языка, аundefined
по какой-то причине - нет.Если ваш код основан на сравнении,
undefined
как если бы это было ключевое слово (if (foo == undefined)
- очень простая ошибка), это работает только потому, что никто не определил переменную с таким именем. Весь этот код уязвим для того, чтобы кто-то случайно или злонамеренно определил глобальную переменную с этим именем. Конечно, все мы знаем, что случайное определение глобальной переменной в javascript совершенно невозможно ...источник
void 0
вместо undefined.Просто хочу добавить, что при использовании определенных библиотек javascript значения null и undefined могут иметь непредвиденные последствия.
Например,
get
функция lodash , которая принимает значение по умолчанию в качестве третьего аргумента:Другой пример: если вы используете defaultProps в React, если свойство передается
null
, свойства по умолчанию не используются, потому что null интерпретируется как определенное значение . напримеристочник
Я полностью не согласен с тем, что использование null или undefined не требуется. undefined - это то, что поддерживает весь процесс цепочки прототипов. Таким образом, компилятор только с нулевым значением не может проверить, равно ли это свойство нулю или оно не определено в прототипе конечной точки. В других языках с динамической типизацией (например, Python) он выдает исключение, если вам нужен доступ к неопределенному свойству, но для языков на основе прототипов компилятор также должен проверять родительские прототипы, и именно здесь undefined больше всего требуется.
Весь смысл использования null - это просто привязать переменную или свойство к объекту, который является одноэлементным и имеет значение пустоты, а также использование null имеет цели производительности. Эти 2 кода имеют разное время выполнения.
источник
undefined
не имеет особого значения для наследования прототипов. Свойство, установленное на,undefined
все равно переопределит свойство (с тем же именем), унаследованное от прототипа.Неизвестный переменная
undefined
.Известные переменная еще нет значения:
null
.server_object
.server_object.errj
. Он говорит вам, что этоundefined
. Это означает, что он не знает, что это такое.server_object.err
. Он говорит вам, что этоnull
. Это означает, что вы ссылаетесь на правильную переменную, но она пуста; поэтому ошибки нет.Проблема в том, что вы объявляете имя переменной без значения (
var hello
) js объявляет, что какundefined
: эта переменная не существует; тогда как программисты в основном имеют в виду: «Я еще не придал этому значения», определениеnull
.Таким образом, поведение программиста по умолчанию - объявление переменной без значения как ничто - противоречит js - объявлению ее несуществующей. Кроме того,
!undefined
и то!null
и другое,true
поэтому большинство программистов рассматривают их как эквивалентные.Вы, конечно, можете убедиться, что вы всегда будете это делать,
var hello = null
но большинство из них не будет засорять свой код как таковой, чтобы гарантировать корректность типов на преднамеренно слабо типизированном языке, когда они и!
оператор рассматривают обаundefined
иnull
как эквивалентные.источник