У меня есть написанная мною функция, которая выглядит примерно так:
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's 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;
}
Вопрос: Не лучше ли было бы здесь вернуть «ноль»?
Я могу передать обратно все, что захочу - очевидно ... Я просто не знал, что лучше использовать.
Код, вызывающий эту функцию, знает, как работать с undefined (на самом деле этого никогда не произойдет, если что-то пойдет не так, как надо)
Причина, по которой я задаю этот вопрос, заключается в том, что я где-то слышал что-то вроде «Не назначать неопределенные переменные» или что-то в этом роде - это затруднит отладку. Итак, тот факт, что я вижу, что это null
передается обратно, говорит мне, что возврат работает, но в основном работает аналогично undefined
.
Документация:
Mozilla Docs Не ответил на мой вопрос ... Google тоже не ответил: \
Этот ТАК вопрос - был слишком широким для того, что я пытаюсь понять здесь.
null
. Оставьтеundefined
сам JavaScript. Однако «лучше» не бывает, так что это вопрос личного мнения.null
как «нет подходящей ценности для того, о чем вы просите» иundefined
как «Я не могу понять, о чем вы просите».Ответы:
Я буду утверждать, что нет лучшего способа, и даже стандартные функции иногда выбирают то или другое.
Например:
[[Прототип]]
У обычных объектов есть внутренний слот [[Prototype]], который определяет, от какого другого объекта они наследуют. Конечно, должен быть способ сказать, что объект не наследуется ни от одного другого. В этом случае «такого объекта нет» передается с помощью
null
.Object.getOwnPropertyDescriptor
Ожидается, что он вернет дескриптор свойства, то есть объект, который описывает свойство (например, значение, возможность записи, перечисляемость и возможность настройки). Однако собственность может не существовать. В этом случае «такого свойства нет» передается с помощью
undefined
.document.getElementById
Ожидается, что он вернет элемент с данным идентификатором. Однако элемента с таким идентификатором может не быть. В этом случае «такого элемента нет» передается с помощью
null
.Так что просто выберите то, что вы предпочитаете или считаете более подходящим для вашего конкретного случая.
источник
void 0
технику для будущих зрителей этого ответа. Я также добавил код, чтобы прояснить вашу точку зрения. Спасибо за ваш ответ!Неопределенный обычно относится к чему-то, чему еще не было присвоено значение (пока). Null относится к чему-то, что определенно не имеет ценности. В этом случае я бы рекомендовал вернуть null. Обратите внимание, что функция без указанного возвращаемого значения неявно возвращает undefined.
Из спецификации ECMAScript2015
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
Дальнейшее чтение:
Когда в JavaScript используется значение null или undefined?
источник
var x=someFunc();
, я намеренно присваиваю значение xa и предпочел бы, чтобы оно не проходило никаких тестов, которые указывают, что ему не было (или могло не быть) присвоено значение. Just imhonull
), пока вы придерживаетесь одного, но наличие двух значений, указывающих на отсутствие значения (независимо от «типа»), всегда сбивает с толкуЯ дам вам свой личный выбор между ними.
Мой простой вопрос: может ли значение при другом вводе / состоянии / контексте быть определено для чего-то?
Если да, то используйте
null
else useundefined
. В более общем плане любая функция, возвращающая объект, должна возвращать,null
когда предполагаемый объект не существует. Потому что он мог существовать при другом вводе / состоянии / контексте.null
представляет отсутствие значения для данного ввода / состояния / контекста. Это неявно означает, что концепция самого значения существует в контексте вашего приложения, но может отсутствовать. В вашем примере существует концепция следующей карты, но сама карта может не существовать.null
должен быть использован.undefined
неявно представляет отсутствие смысла этого значения в контексте вашего приложения. Например, если я манипулируюuser
объектом с заданным набором свойств и пытаюсь получить доступ к этому свойствуpikatchu
. Значение этого свойства должно быть установлено равным,undefined
потому что в моем контексте иметь такое свойство не имеет смысла.источник
null
, а функции с побочными эффектами должны возвращатьсяundefined
, если думать как функциональный программист.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 оператора.источник
undefined
не нужно назначать. Все объявленные переменные без значений уже естьundefined
.(function(){ /* code */ })()
в консоли возвращается null.undefined
на моей консоли Chrome и Firefox.undefined
если что-то еще не вернется раньше - мне не нужно, потому что поведение функции по умолчанию, если вы ничего не возвращаете - это возвращает undefined - они просто говорят, что в этом нет необходимости. Далее ... Мне нравится то, что вы сказали о встроенных функциях получения, возвращающих null. Пожалуйста, опубликуйте свой ответ на этот счет, и я приму его.Зависит от того, что вам нужно делать с возвращенным значением.
typeof null возвращает объект. этот объект имеет значение undefined
typeof undefined возвращает undefined
источник
typeof
не обязательно возвращает истинный тип данных значения, у него есть карта, которая сопоставляет типы данных с метками и возвращает соответствующую метку.typeof
, несмотря на свое название, он не сообщает тип значения.Вот пример, который
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
нет.источник
let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };
. Теперь я уверен, что эти два возврата можно было бы обработать по-разному, и они могли бы не выиграть соревнование по гольфу JS. Оно работает.Первый ответ правильный. Теоретически они имеют разное значение. Однако не всегда понятно, что выбрать.
Я обычно использую null в своей разработке, хотя думаю, что это полностью субъективно.
Я использую это в основном потому, что:
В старых браузерах переменная undefined может быть перезаписана, поэтому ее возврат немного сложнее. Эта же проблема заставляет вас использовать
typeof var === 'undefined'
при получении результатов функции. ссылка на сайтДругие языки, как правило, широко используют null, многие из них даже не имеют undefined (например, php). Это дает мне некоторую последовательность при быстром переключении между языками.
источник
Думаю, что использовать - спорный вопрос. Я предпочитаю код, который семантически максимально точен, поэтому я думаю
undefined
в данном случае он подходит.Я думаю, что
null
присваивания означают «нулевую переменную». Это в отличие отundefined
означает, что "этой вещи вообще нет".Как указывалось в предыдущем ответе, у возврата
undefined
есть проблемы, и вам решать, беспокоит ли это вас. Меня это не беспокоит.источник
document.getElementById('iDoNotExist')
возвращаетсяnull
, хотя по смыслу ближе к «этой вещи вообще нет». Если стандартные методы это делают, то почему не OP?Я бы сказал, что в этом случае
null
нужно вернуть.Если рассматривать этот вопрос с теоретической информатики точки зрения , то не определено , используется для обозначения не терминации / не-вычислимости (т.е. заполнитель для неопределенного точки
x
в виде частичной функцииf
, которая часто написанf(x) = ⊥
).getNextCard
однако, похоже, может вычислить следующую карту (если она существует), а также может вычислить, нет ли следующей карты. Другими словами, функция является полной, поскольку она завершается для каждого ввода.При этом требуется специальное значение, сигнализирующее о завершении без значимого результата (т.е. «нет карты, которую я могу вернуть для этого ввода»), а для меня этого
null
нетundefined
.ПРИМЕЧАНИЯ:
Вы можете увидеть некоторую поддержку этого аргумента в некоторых других типизированных языках, где завершение без значимого результата выражается с использованием типа параметра (иногда также называемого типом, допускающим значение NULL ). Примером этого является Maybe в Haskell .
С другой стороны, мы, конечно, не знаем, что
undefined
на самом деле должно означать JavaScript. Таким образом, аналогия с undefined несколько неубедительна. Более того, поскольку мы всегда хотим работать с общими функциями, это равносильно тому, чтобы сказать «никогда не возвращатьсяundefined
из функции». Это кажется немного строгим, так как это ограничило бы использованиеundefined
свойств / переменных, которые не были установлены.В конце концов, мое личное предпочтение - никогда не возвращаться
undefined
туда, куда я могу вернуться,null
и я также считаю, что это лучшее соглашение о кодировании (потому что, среди прочего,x !== null
оно корочеtypeof x !== 'undefined'
).источник
Мое личное мнение по моему опыту - не используйте 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
может легко привести к сбою вашего кодаисточник