Ich habe eine Funktion, die ich geschrieben habe und die im Grunde so aussieht:
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;
}
Frage: Wäre es besser, hier "null" zurückzugeben?
Ich kann alles zurückgeben, was ich will - offensichtlich ... Ich war mir einfach nicht sicher, was das Beste ist.
Der Code, der diese Funktion aufruft, weiß, wie man mit undefiniert umgeht (es wird tatsächlich nie wirklich passieren, wenn nicht etwas schrecklich schief geht).
Der Grund, warum ich diese Frage stelle, ist, dass ich irgendwo etwas gehört habe, das sich wie "Variablen nicht undefiniert zuweisen" oder so anhörte - dass es das Debuggen erschwert. Die Tatsache, dass ich sehe, dass null
das zurückgegeben wird, sagt mir, dass die Rückgabe funktioniert - aber im Grunde funktioniert es ähnlich wie undefined
.
Dokumentation:
Mozilla Docs hat meine Frage nicht beantwortet ... Google auch nicht: \
Diese SO-Frage war viel zu weit gefasst für das, was ich hier herausfinden möchte.
null
. Überlassen Sieundefined
JavaScript. Es gibt jedoch kein "besseres", daher ist dies Ansichtssache.null
als "es gibt keinen angemessenen Wert für das, wonach Sie fragen" undundefined
als "Ich kann nicht herausfinden, wonach Sie fragen".Antworten:
Ich werde argumentieren, dass es keinen besten Weg gibt, und sogar Standardfunktionen wählen manchmal den einen oder anderen.
Beispielsweise:
[[Prototyp]]
Gewöhnliche Objekte haben einen internen Steckplatz, der bestimmt, von welchem anderen Objekt sie erben. Natürlich muss es eine Möglichkeit geben zu sagen, dass ein Objekt von keinem anderen erbt. In diesem Fall wird "es gibt kein solches Objekt" mit dargestellt
null
.Object.getOwnPropertyDescriptor
Es wird erwartet, dass ein Eigenschaftsdeskriptor zurückgegeben wird, dh ein Objekt, das eine Eigenschaft beschreibt (z. B. Wert, Schreibbarkeit, Aufzählbarkeit und Konfigurierbarkeit). Die Eigenschaft kann jedoch nicht vorhanden sein. In diesem Fall wird "es gibt keine solche Eigenschaft" mit dargestellt
undefined
.document.getElementById
Es wird erwartet, dass das Element mit der angegebenen ID zurückgegeben wird. Möglicherweise ist jedoch kein Element mit dieser ID vorhanden. In diesem Fall wird "es gibt kein solches Element" mit dargestellt
null
.Wählen Sie also einfach, was Sie bevorzugen oder was für Ihren speziellen Fall sinnvoller ist.
quelle
void 0
Technik für zukünftige Betrachter dieser Antwort vorzuschlagen . Ich habe auch Code hinzugefügt, um Ihren Standpunkt klarer zu machen. Vielen Dank für Ihre Antwort!Undefiniert bezieht sich normalerweise auf etwas, dem (noch) kein Wert zugewiesen wurde. Null bezieht sich auf etwas, das definitiv keinen Wert hat. In diesem Fall würde ich empfehlen, eine Null zurückzugeben. Beachten Sie, dass eine Funktion ohne angegebenen Rückgabewert implizit undefiniert zurückgibt.
Aus der ECMAScript2015-Spezifikation
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
Weiterführende Literatur:
Wann wird in JavaScript null oder undefiniert verwendet?
quelle
var x=someFunc();
, weise ich absichtlich einen xa-Wert zu und möchte lieber keine Tests bestehen, die darauf hinweisen, dass ihm kein Wert zugewiesen wurde (oder möglicherweise nicht). Nur imhonull
), solange Sie sich an einen halten, aber 2 Werte zu haben, um anzuzeigen, dass kein Wert vorhanden ist (unabhängig vom "Typ"), ist immer verwirrendIch werde Ihnen meine persönliche Meinung zur Wahl zwischen beiden geben.
Meine einfache Frage lautet: Könnte der Wert bei einer anderen Eingabe / einem anderen Status / Kontext für etwas definiert werden?
Wenn die Antwort ja ist, verwenden Sie
null
else useundefined
. Im Allgemeinen sollte jede Funktion, die ein Objekt zurückgibt, zurückgegeben werden,null
wenn das beabsichtigte Objekt nicht vorhanden ist. Weil es bei einem anderen Eingang / Zustand / Kontext existieren könnte.null
repräsentiert das Fehlen eines Wertes für eine gegebene Eingabe / einen gegebenen Zustand / einen gegebenen Kontext. Dies bedeutet implizit, dass das Konzept des Werts selbst im Kontext Ihrer Anwendung existiert, aber möglicherweise nicht vorhanden ist. In Ihrem Beispiel existiert das Konzept einer nächsten Karte, aber die Karte selbst existiert möglicherweise nicht.null
sollte benutzt werden.undefined
stellt implizit das Fehlen einer Bedeutung dieses Werts im Kontext Ihrer Anwendung dar. Zum Beispiel, wenn ich einuser
Objekt mit einem bestimmten Satz von Eigenschaften manipuliere und versuche, auf die Eigenschaft zuzugreifenpikatchu
. Der Wert dieser Eigenschaft sollte festgelegt werden,undefined
da es in meinem Kontext keinen Sinn macht, eine solche Eigenschaft zu haben.quelle
null
, während Funktionen mit Nebenwirkungen zurückkehren solltenundefined
, wenn Sie wie ein funktionaler Programmierer denken.undefined
ist nicht etwas, dem Sie zuweisen sollten. Möglicherweise möchten Sie etwas anderes als zurückgebenundefined
. In Ihrem Fall ist das Ergebnisundefined
bereits vorhanden , auch wenn Sie überhaupt nichts zurückgeben . Also würde ich vorschlagen, stattdessen mit zu gehennull
.Betrachten Sie dieses Beispiel,
Das obige Beispiel ergibt
a === b
, was istundefined
. Der Unterschied besteht darin, dass Sie 1 Anweisungsausführung speichern.quelle
undefined
muss nicht zugewiesen werden. Alle deklarierten Variablen ohne Werte sind bereits vorhandenundefined
.(function(){ /* code */ })()
in einer Konsole null zurückgegeben wird.undefined
auf meiner Chrom- und Firefox-Konsole.undefined
wenn etwas anderes nicht früher zurückkehrt - ich muss es nicht, weil das Standardverhalten der Funktion wenn Sie geben nichts zurück, um undefiniert zurückzukehren - sie sagen nur, dass dies nicht benötigt wird. Weiter ... Mir gefällt, was Sie über integrierte Getter-Funktionen zu sagen hatten, die null zurückgeben. Bitte posten Sie Ihre Antwort in diesem Sinne und ich werde es akzeptieren.Hängt davon ab, was Sie mit dem zurückgegebenen Wert tun müssen.
typeof null gibt ein Objekt zurück. Dieses Objekt hat den Wert undefined
typeof undefined gibt undefined zurück
quelle
typeof
Gibt nicht unbedingt den wahren Datentyp eines Werts zurück, sondern verfügt über eine Zuordnung, die Datentypen Labels zuordnet und das entsprechende Label zurückgibt.typeof
, trotz seines Namens sagt es nicht den Typ eines Wertes.Hier ist ein Beispiel, wo
undefined
mehr Sinn macht alsnull
:Ich benutze eine Wrapper-Funktion
JSON.parse
, die ihre Ausnahme in Folgendes konvertiertundefined
:Beachten Sie, dass dies
null
in JSON gültig ist, während diesundefined
nicht der Fall ist.quelle
let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };
. Ich bin mir sicher, dass die beiden Renditen unterschiedlich gehandhabt werden könnten und den JS-Golfwettbewerb möglicherweise nicht gewinnen würden. Es klappt.Ich denke, es ist sehr umstritten, was zu verwenden ist. Ich bevorzuge Code, der semantisch so genau wie möglich ist, denke ich
undefined
dies in diesem Fall angemessen.Ich stelle mir
null
Zuweisungen als "eine Variable, die auf nichts gesetzt ist" vor. Dies ist im Gegensatz zu derundefined
Bedeutung "dieses Ding ist überhaupt nicht da"Wie bereits in einer früheren Antwort erwähnt, hat die Rückkehr
undefined
Probleme, und es liegt ganz bei Ihnen, ob Sie dies stört. Es würde mich nicht stören.quelle
document.getElementById('iDoNotExist')
kehrt zurücknull
, obwohl die Bedeutung näher an "dieses Ding ist überhaupt nicht da" liegt. Wenn Standardmethoden dies tun, warum nicht OP?Ich würde argumentieren, dass in diesem Fall zurückgegeben werden
null
sollte.Wenn Sie die Frage aus theoretischer Informatik betrachten, wird undefiniert verwendet, um die Nichtbeendigung / Nichtberechnbarkeit anzuzeigen (dh den Platzhalter für einen undefinierten Punkt
x
einer Teilfunktion,f
die häufig geschrieben wirdf(x) = ⊥
).getNextCard
scheint jedoch in der Lage zu sein, die nächste Karte zu berechnen (falls vorhanden) und auch zu berechnen, wenn es keine nächste Karte gibt. Mit anderen Worten, die Funktion ist total, da sie für jede Eingabe beendet wird.Davon abgesehen ist ein spezieller Wert erforderlich, der die Beendigung ohne aussagekräftiges Ergebnis signalisiert (dh "Es gibt keine Karte, die ich für diesen Eingang zurückgeben kann"), und dies ist für mich
null
nicht der Fallundefined
.ANMERKUNGEN:
Sie können dieses Argument auch in einigen anderen typisierten Sprachen unterstützen, in denen die Beendigung ohne aussagekräftiges Ergebnis mithilfe eines Optionstyps (manchmal auch als nullfähiger Typ bezeichnet ) ausgedrückt wird . Ein Beispiel dafür ist Vielleicht in Haskell .
Andererseits wissen wir natürlich nicht, was
undefined
JavaScript eigentlich bedeuten soll. Die Analogie zu undefiniert ist also etwas zart. Da wir immer mit Gesamtfunktionen arbeiten möchten, bedeutet dies außerdem, dass wir niemalsundefined
von einer Funktion zurückkehren. Das scheint etwas streng zu sein, da es die Verwendungundefined
auf Eigenschaften / Variablen beschränken würde, die nicht festgelegt wurden.Am Ende ist es meine persönliche Präferenz, niemals dorthin zurückzukehren,
undefined
wo ich zurückkehren kann,null
und ich würde auch argumentieren, dass dies die bessere Codierungskonvention ist (weil sie unter anderemx !== null
kürzer ist alstypeof x !== 'undefined'
).quelle
Die erste Antwort ist richtig. Sie haben theoretisch unterschiedliche Bedeutung. Es ist jedoch nicht immer klar, welche Sie abholen sollen.
Ich neige dazu, Null in meiner Entwicklung zu verwenden, obwohl ich denke, dass das völlig subjektiv ist.
Ich benutze das hauptsächlich, weil:
undefinierte Variablen werden in alten Browsern möglicherweise überschrieben, sodass die Rückgabe etwas komplizierter ist. Das gleiche Problem zwingt Sie,
typeof var === 'undefined'
wenn Sie Funktionsergebnisse erhalten. VerknüpfungAndere Sprachen verwenden in der Regel häufig Null, viele von ihnen haben nicht einmal undefiniert (z. B. PHP). Das gibt mir eine Art Konsistenz, wenn ich schnell zwischen Sprachen wechsle.
quelle
Meine persönliche Meinung ist meiner Erfahrung nach, dass Sie nicht undefiniert und null verwenden, wenn Sie Ihren Code nicht zum Absturz bringen möchten. Zumindest würde ich es persönlich vermeiden. Es gibt viele Funktionen in Javascript, die undefiniert zurückgeben, und ok, wir müssen sie verwenden. Aber wenn Sie Ihren Code entwerfen, verwenden Sie ihn nicht. Es ist wichtig, immer
"false"
mindestens etwas zurückzugeben . Wenn Sie beispielsweise ein Array haben und es zuordnen. Es ist nicht gut zurückzukehren[undefined, undefined.....]
oder einfachundefined
. Ist besser, wenn Sie den Typ des ursprünglichen Arrays beibehalten. Beispiel:Das ist die Idee. Ich versuche die ganze Zeit, es zu vermeiden. Weil ein
null
oderundefined
Ihren Code leicht zum Absturz bringen kannquelle