Подтвердить что ты не робот

Лучше ли возвращать `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 - был слишком широким для того, что я пытаюсь понять здесь.

4b9b3361

Ответ 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 могут легко вывести из строя ваш код