Лучше ли возвращать `undefined` или `null` из функции javascript?
У меня есть функция, которую я написал, которая в основном выглядит так:
function getNextCard(searchTerms) {
// Setup Some Variables
// Do a bunch of logic to pick the next card based on termed passed through what I'll call here as 'searchTerms' all of this logic is omitted because it not important for my question.
// ...
// If we find a next card to give, than give it
if (nextCardFound)
return nextCardFound;
// Otherwise - I'm returning undefined
return undefined;
}
Вопрос: Было бы лучше вернуть "null" здесь?
Я могу передать все, что захочу - очевидно... Я просто не был уверен, что лучше всего использовать.
Код, вызывающий эту функцию, знает, как справиться с undefined (это на самом деле никогда не произойдет, если что-то не будет ужасно ошибочным)
Причина, по которой я задаю этот вопрос, заключается в том, что я где-то слышал что-то вроде "Не назначаю переменные undefined" или что-то еще, - что это затруднит отладку. Итак, тот факт, что я вижу, что null
передается обратно, говорит мне, что возврат работает, но в основном работает аналогично undefined
.
Документация:
Документы Mozilla Не ответил на мой вопрос... Google не сделал этого:\
This SO Question - был слишком широким для того, что я пытаюсь понять здесь.
Ответы
Ответ 1
Я буду утверждать, что нет лучшего способа, и даже стандартные функции иногда выбирают тот или иной.
Например:
-
[[Prototype]]
Обычные объекты имеют внутренний слот [[Prototype]], который определяет, из какого другого объекта они наследуются. Конечно, должен быть способ сказать, что объект не наследуется ни от одного другого. В этом случае "нет такого объекта" представляется с помощью null
.
-
Object.getOwnPropertyDescriptor
Ожидается, что он вернет дескриптор свойства, то есть объект, который описывает свойство (например, значение, возможность записи, перечислимость и конфигурируемость). Однако свойство может не существовать. В этом случае "нет такого свойства" представляется с помощью undefined
.
-
document.getElementById
Ожидается вернуть элемент с данным ID. Однако не может быть элемента с этим идентификатором. В этом случае "нет такого элемента" представляется с помощью null
.
Так что просто выберите то, что вы предпочитаете или думаете, имеет смысл для вашего конкретного случая.
Ответ 2
Undefined обычно ссылается на то, что еще не присвоено значение (пока). Null ссылается на то, что окончательно не имеет значения. В этом случае я бы рекомендовал вернуть нуль. Обратите внимание, что функция без указанного возвращаемого значения неявно возвращает undefined.
Из спецификации ECMAScript2015
4.3.10 undefined Значение
примитивное значение, используемое, когда переменной не присвоено значение
4.3.12 null value
примитивное значение, которое представляет намеренное отсутствие какого-либо значения объекта
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
Дальнейшее чтение:
Когда значение null или undefined используется в JavaScript?
Ответ 3
Я дам вам мой личный способ выбора между ними.
Мой простой вопрос: Может ли какое-то значение задать другой вход/состояние/контекст?
Если да, то используйте null
else use undefined
. В более общем случае любая функция, возвращающая объект, должна возвращать null
, когда предполагаемый объект не существует. Потому что он может существовать с учетом другого ввода/состояния/контекста.
null
представляет отсутствие значения для заданного входного/состояния/контекста. Это подразумевает, что концепция самого значения существует в контексте вашего приложения, но может отсутствовать.
В вашем примере существует концепция следующей карты, но сама карта может не существовать. null
.
undefined
неявно представляет отсутствие значения этого значения в контексте вашего приложения. Например, если я манипулирую объектом user
с заданным набором свойств, и я пытаюсь получить доступ к свойству pikatchu
. Значение этого свойства должно быть установлено на undefined
, потому что в моем контексте не имеет никакого смысла иметь такое свойство.
Ответ 4
undefined
- это не то, что вы должны назначить. Возможно, вы захотите вернуться к чему-то другому, кроме undefined
. В вашем случае, даже если вы ничего не вернете, результат будет undefined
уже. Итак, я предлагаю пойти вместо null
.
Рассмотрим этот образец,
function getSomething() {
// .. do something
return undefined;
}
function doSomething() {
// .. I'm not gonna return anything.
}
var a = getSomething();
var b = doSomething();
Выше результата выборки в a === b
, который равен undefined
. Разница в том, что вы сохраняете 1 выполнение инструкции.
Ответ 5
Зависит от того, что вам нужно делать с возвращаемым значением.
typeof null возвращает объект. этот объект имеет значение undefined
typeof undefined возвращает undefined
Ответ 6
Вот пример, где undefined
имеет больше смысла, чем null
:
Я использую функцию-обертку для JSON.parse
, которая преобразует ее исключение в undefined
:
// parses s as JSON if possible and returns undefined otherwise
// return undefined iff s is not a string or not parseable as JSON; undefined is not a valid JSON value https://stackoverflow.com/a/14946821/524504
function JSON_parse_or_undefined(s) {
if ("string" !== typeof s) return undefined
try {
const p = JSON.parse(s)
return p
} catch (x){}
return undefined
}
Обратите внимание, что null
действует в JSON, а undefined
- нет.
Ответ 7
Я думаю, что это очень спорно, что использовать. Я предпочитаю код, который семантически максимально точным, поэтому я думаю, что undefined
подходит в этом случае.
Я думаю о назначениях null
как о значении "переменная, заданная ничем". Это в отличие от undefined
, означающего "эта вещь вообще не существует"
Как указывалось в предыдущем ответе, возврат undefined
имеет проблемы, и это полностью зависит от того, беспокоит ли это вас. Меня это не беспокоило.
Ответ 8
Я бы сказал, что в этом случае null
должен быть возвращен.
Если вы рассматриваете вопрос с точки зрения теоретической информатики, тогда undefined используется для обозначения не прекращения/не вычислимости (т.е. заполнителя для неопределенной точки x
из частичная функция f
, которая часто пишется f(x) = ⊥
).
Однако getNextCard
, похоже, может вычислить следующую карту (если она существует), а также может вычислить, если следующей карты нет. Другими словами, функция является общей, так как она завершается для каждого входа.
При этом специальное значение, сигнализирующее об окончании без значимого результата (т.е. "Нет карты, которую я могу вернуть за этот вход"), требуется для меня null
, а не undefined
.
ПРИМЕЧАНИЯ:
Вы можете увидеть некоторую поддержку этого аргумента и в некоторых других типизированных языках, где завершение без значимого результата выражается с использованием параметра типа (иногда также называемого обнуляемым типом). Примером этого является "Возможно в Хаскеле".
С другой стороны, мы, конечно, не знаем, что на самом деле должно означать undefined
в JavaScript. Таким образом, аналогия с неопределенным является несколько сомнительной. Более того, поскольку мы всегда хотим работать с полными функциями, это означает, что "никогда не возвращать undefined
из функции". Что кажется немного строгим, так как это ограничит использование undefined
свойствами/переменными, которые не были установлены.
В конце концов, мое личное предпочтение - никогда не возвращаться undefined
, где я могу вернуть null
, и я также утверждаю, что это лучшее соглашение по кодированию (поскольку среди прочего x !== null
короче, чем typeof x !== 'undefined'
).
Ответ 9
Первый ответ правильный. Они имеют теоретически другой смысл. Однако не всегда понятно, что подобрать.
Я склонен использовать null в своем развитии, хотя я считаю это полностью субъективным.
Я использую это в основном потому, что:
-
undefined переменная может быть перезаписана в старых браузерах, поэтому возврат ее немного сложнее. Эта же проблема заставляет вас использовать typeof var === 'undefined'
при получении результатов функции. ссылка
-
Другие языки имеют тенденцию широко использовать нуль, многие из них даже не имеют undefined (например, php). Это дает мне некоторую последовательность при быстрой перестановке между языками.
Ответ 10
По моему личному мнению, я не использую undefined и null, если вы не хотите разрушать свой код. По крайней мере, я бы избегал этого лично. В Javascript есть много функций, которые возвращают undefined, и мы должны использовать его. Но когда вы разрабатываете свой код, не используйте его. Важно всегда возвращать что-то "false"
как минимум. Если у вас есть массив, например, и вы отображаете его. Нехорошо возвращать [undefined, undefined.....]
или просто undefined
. Лучше, если вы сохраните тип исходного массива.
Пример:
const mapper:Map <string[],boolean[]>
['i', 'dont', 'use', 'null or undefined'] -> [false, true, false, true, false]
or ['', dont, '', '', use]
or al the stuff above and then filter(v => v)
that will keep all undefined and null out
Это идея.
Я стараюсь все время избегать этого. Потому что null
или undefined
могут легко вывести из строя ваш код