Какая причина использовать ноль вместо неопределенного в JavaScript? - PullRequest
88 голосов
/ 07 июля 2011

Я давно пишу JavaScript, и у меня никогда не было причин использовать null. Кажется, что undefined всегда предпочтительнее и служит той же цели программно. Какие практические причины использовать null вместо undefined?

Ответы [ 12 ]

74 голосов
/ 07 июля 2011

У меня действительно нет ответа, но согласно Николасу С. Закасу , стр. 30 его книги " Профессиональный JavaScript для веб-разработчиков " :

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

39 голосов
/ 03 марта 2015

Null и undefined - это два разных значения, которые означают одно и то же.Единственное отличие состоит в соглашениях в том, как вы используете их в вашей системе.Как уже упоминалось, некоторые люди используют нуль для обозначения «нет объекта», когда вы можете иногда получить объект, тогда как неопределенный означает, что объект не ожидался (или что произошла ошибка).Моя проблема с этим совершенно произвольная и совершенно ненужная.

Тем не менее, есть одно существенное отличие: переменные, которые не инициализируются (в том числе параметры функции, в которых не было передано ни одного аргумента, среди прочего), всегда неопределены.

Именно поэтому в моем коде я никогда не использую null, если что-то, что я не контролирую, возвращает null (например, соответствие регулярному выражению).Прелесть этого в том, что она сильно упрощает вещи.Мне никогда не нужно проверять, если x === undefined ||х === ноль.И если вы привыкли использовать == или просто что-то вроде if (x) ....Останови это.!x будет иметь значение true для пустой строки, 0, null, NaN - то есть того, что вы, вероятно, не хотите.Если вы хотите написать javascript, который не является ужасным, всегда используйте тройное равенство === и никогда не используйте null (вместо этого используйте undefined).Это облегчит вашу жизнь.

11 голосов
/ 07 июля 2011

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

Чтобы сделать соглашение полезным, вы должны сначала знать, что вызываемая функция следует соглашению.Затем вы должны явно проверить возвращаемое значение и решить, что делать.Если вы получите undefined , вы можете предположить, что произошла какая-то ошибка , о которой вызываемая функция знала о .Но если произошла ошибка, и функция знала об этом, и было бы полезно отправить ее в более широкую среду, почему бы не использовать объект ошибки?то есть, выдает ошибку?

Итак, в конце концов, соглашение практически бесполезно ни в чем, кроме очень маленьких программ в простых средах.

9 голосов
/ 28 октября 2015

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

Допустим, вы работаете со свойствами объекта, такими как опции для плагина jQuery ... спросите себя, какое значение JavaScript дает свойство, которое еще не определено - ответ undefined. Поэтому в этом контексте я бы инициализировал эти типы вещей с помощью «undefined», чтобы они соответствовали JavaScript (для переменных вы можете сделать var myVar; вместо var myVar = undefined;).

Теперь предположим, что вы выполняете DOM-манипуляции ... какое значение JavaScript присваивает несуществующим элементам? Ответ null. Это значение, которое я инициализировал бы, если вы создаете переменную-заполнитель, которая позднее будет содержать ссылку на элемент, фрагмент документа или аналогичный элемент, относящийся к DOM.

Если вы работаете с JSON, то необходимо сделать особый случай: для неопределенных значений свойств вы должны либо установить для них значение "", либо null, поскольку значение undefined не считается правильным JSON. формат.

С учетом сказанного, как сказал предыдущий плакат, если вы обнаружите, что инициализируете материал с помощью null или undefined более одного раза в голубой луне, то, возможно, вам следует пересмотреть, как вы собираетесь кодировать свои приложение.

9 голосов
/ 07 июля 2011

undefined - это место, где понятия о существовании не существует;у него нет типа, и на него никогда раньше не ссылались;Нуль - это место, где, как известно, существует вещь, но она не имеет значения.

5 голосов
/ 11 января 2018

В конце дня, поскольку и null, и undefined приводят к одному и тому же значению (Boolean(undefined) === false && Boolean(null) === false), вы можете технически использовать любой из них для выполнения работы.Тем не менее, есть правильный путь, IMO.

  1. Оставьте использование undefined для компилятора JavaScript.

    undefined используется для описания переменных, которые неуказать на ссылку.Это то, что компилятор JS позаботится о вас.Во время компиляции движок JS установит значение всех поднятых переменных на undefined.Когда двигатель проходит по коду и значения становятся доступными, двигатель назначит соответствующие значения соответствующим переменным.Для тех переменных, для которых не найдено значений, переменные будут продолжать поддерживать ссылку на примитив undefined.

  2. Использовать только ноль, если вы явно хотите обозначить значениепеременная как не имеющая значения.

    Как @ com2gz заявляет: null используется для определения чего-то программного пустого.undefined означает, что ссылка не существует.Значение null имеет определенную ссылку на «ничто».Если вы вызываете несуществующее свойство объекта, вы получите undefined.Если я сделаю это свойство намеренно пустым, то оно должно быть null, чтобы вы знали, что оно специально.

TLDR; Не используйте undefined примитив.Это значение, которое JS-компилятор автоматически установит для вас, когда вы объявляете переменные без присваивания или пытаетесь получить доступ к свойствам объектов, на которые нет ссылок.С другой стороны, используйте null тогда и только тогда, когда вы намеренно хотите, чтобы переменная не имела значения.

Я никогда явно не устанавливал что-либо на неопределенное (и я не сталкивался с этим во многих кодовых базах, с которыми я взаимодействовал).Также я редко использую null.Единственный раз, когда я использую null, это когда я хочу обозначить значение аргумента функции как не имеющее значения, то есть:

function printArguments(a,b) {
  console.log(a,b);
}

printArguments(null, " hello") // logs: null hello
2 голосов
/ 07 сентября 2016

Вот причина: var undefined = 1 - это допустимый JavaScript, но var null = 1 - синтаксическая ошибка. Разница в том, что null - это ключевое слово языка, а undefined по какой-то причине - нет.

Если ваш код основан на сравнении с undefined, как будто это ключевое слово (if (foo == undefined) - очень простая ошибка), которое работает только потому, что никто не определил переменную с таким именем. Весь этот код уязвим для того, чтобы кто-то случайно или злонамеренно определил глобальную переменную с таким именем. Конечно, мы все знаем, что случайно определить глобальную переменную в javascript совершенно невозможно ...

2 голосов
/ 28 августа 2016

Полезное свойство в null , которое undefined не подходит:

> null + 3
3
> undefined + 3
NaN

Я использую null, когда хочу «выключить» числовое значениезначение, или для инициализации некоторых.Мое последнее использование было манипулирование с преобразованием CSS:

const transforms = { perspective : null, rotateX : null };
// if already set, increase, if not, set to x
runTimeFunction((x) => { trasforms.perspective += x; });
// still useful, as setting perspective to 0 is different than turning it off
runTimeFunction2((x) => { transforms.perspective = null; });

// toCss will check for 'null' values and not set then at all
runTimeFunction3(() => { el.style.transform = toCss(transforms); });

Не уверен, если я должен использовать это свойство думал ...

2 голосов
/ 07 июля 2011

DOM-узлы и элементы не являются неопределенными, но могут иметь значение null.

  • NextSibling последнего дочернего элемента элемента равен нулю.

  • PreviousSibling первого дочернего элемента имеет значение NULL.

  • Ссылка на document.getElementById имеет значение NULL, если элемент не существует в документе.1016 * Но ни в одном из этих случаев значение не определено ;там просто нет узла.

1 голос
/ 01 июля 2016

Я сейчас прорабатываю этот точный вопрос и изучаю следующую философию:

  1. Любая функция, предназначенная для возврата результата, должна возвращать ноль, если она не может найти результат
  2. Любая функция, которая НЕ предназначена для неявного возврата результата, возвращает undefined.

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

Этот ответ не пытается адресовать:

  1. Значения свойства null против неопределенного
  2. Переменные в ваших функциях равны нулю противundefined

На мой взгляд, переменные - это ваше собственное дело, а не часть вашего API, а свойства в любой ОО-системе определены и поэтому должны определяться со значением, отличным от того, каким они были бы, если бы неопределено (пусто для определенного, неопределенное - это то, что вы получаете, когда получаете доступ к тому, чего нет в вашем объекте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...