Ich schreibe schon ziemlich lange JavaScript und hatte nie einen Grund, es zu verwenden null
. Es scheint, dass dies undefined
immer vorzuziehen ist und programmgesteuert denselben Zweck erfüllt. Was sind einige praktische Gründe, null
anstatt zu verwenden undefined
?
javascript
null
undefined
Jimmy Cuadra
quelle
quelle
document.getElementById()
, die zurückkehren können,null
aber nicht.undefined
Warum sollten Sie in diesen Fällen die Rückgabe testenundefined
? (Sicher, es würde funktionieren , wenn Sie verwenden ,==
anstatt===
, aber immer noch, warum sollten Sie sich bewusst Test für die falsche Sache?)document.getElementById('does-not-exist')
. B. ). Variablenvar a;
und Funktionsrückgabewerte sind standardmäßig undefiniert. In der Vergangenheit befand sich null im globalen Bereich, daher verlangsamte die Verwendung die Ausführung und führte dazu, dass ich andere falsche Typen (false, '', 0) freien Referenzen vorzog. Ich persönlich vermeide Null, es sei denn, es gibt einen zwingenden Grund, weil ich es als einfacher empfinde, was im Allgemeinen besser ist.Antworten:
Null und undefiniert sind im Wesentlichen zwei verschiedene Werte, die dasselbe bedeuten. Der einzige Unterschied besteht in den Konventionen, wie Sie sie in Ihrem System verwenden. Wie einige erwähnt haben, verwenden einige Leute null, um "kein Objekt" zu bedeuten, wobei Sie manchmal ein Objekt erhalten, während undefiniert bedeutet, dass kein Objekt erwartet wurde (oder dass ein Fehler aufgetreten ist). Mein Problem dabei ist, dass es völlig willkürlich und völlig unnötig ist.
Es gibt jedoch einen großen Unterschied: Variablen, die nicht initialisiert wurden (einschließlich Funktionsparametern, bei denen unter anderem kein Argument übergeben wurde), sind immer undefiniert.
Aus diesem Grund verwende ich in meinem Code niemals null, es sei denn, etwas, das ich nicht kontrolliere, gibt null zurück (z. B. Regex-Matching). Das Schöne daran ist, dass es die Dinge sehr vereinfacht. Ich muss nie überprüfen, ob x === undefined || x === null. Und wenn Sie die Gewohnheit haben, == zu verwenden oder einfach Dinge wie if (x) .... Hör auf.
!x
wird für eine leere Zeichenfolge, 0, null, NaN als wahr ausgewertet - dh Dinge, die Sie wahrscheinlich nicht wollen. Wenn Sie Javascript schreiben möchten, das nicht schrecklich ist, verwenden Sie immer Triple Equals === und niemals Null (verwenden Sie stattdessen undefined). Es wird dir das Leben leichter machen.quelle
===
oder!==
. JS ist eine fantastisch ausdrucksstarke Sprache, wenn Sie wissen, wie man sie benutzt.null
/undefined
-Dichotomie notwendig ist, weil die ursprüngliche Version von JS nicht hattehasOwnProperty
oder derin
Operator. Jetzt verstehe ich nicht wirklich, warum einer von ihnen in ES6 oder anderen ES7-Vorschlägen, die ich gesehen habe, nicht abgeschafft wurde.Ich habe keine wirkliche Antwort, aber laut Nicholas C. Zakas , Seite 30 seines Buches " Professionelles JavaScript für Webentwickler " :
quelle
undefined
dass eine Katastrophe passiert ist. Nur imho.var myVar;
und explizit nach dem Wert suchen,undefined
um festzustellen, ob er zu einem späteren Zeitpunkt mit einer Objektreferenz gefüllt wurde. Mein Punkt ist, dass dies völlig akademisch ist - Sie können es so oder so tun, und jeder, der einen Weg über den anderen rät, drängt einfach auf seine eigene Konvention.undefined
undnull
. Das ist immer noch sehr nervig. Ich vermeide es, eine Variablenull
zuzuweisen, um die Anzahl der zusätzlichennull
Tests zu verringern .==
Vergleich (im Gegensatz zu===
) sinnvoll ist:v == null
(oderv == undefined
) prüft auf null oder undefiniert.Am Ende des Tages können Sie beide technisch verwenden, um die Arbeit zu erledigen , da beide
null
undundefined
derselbe Wert (Boolean(undefined) === false && Boolean(null) === false
) erzwungen werden. Es gibt jedoch den richtigen Weg, IMO.Überlassen Sie die Verwendung
undefined
dem JavaScript-Compiler.undefined
wird verwendet, um Variablen zu beschreiben, die nicht auf eine Referenz verweisen. Es ist etwas, das der JS-Compiler für Sie erledigt. Zur Kompilierungszeit setzt die JS-Engine den Wert aller angehobenen Variablen aufundefined
. Sobald der Motor den Code durchläuft und Werte verfügbar werden, weist der Motor den jeweiligen Variablen entsprechende Werte zu. Für diejenigen Variablen, für die keine Werte gefunden wurden, behalten die Variablen weiterhin einen Verweis auf das Grundelement beiundefined
.Verwenden Sie null nur, wenn Sie den Wert einer Variablen explizit als "kein Wert" bezeichnen möchten.
Wie @ com2gz angibt:
null
wird verwendet, um etwas programmgesteuert Leeres zu definieren.undefined
soll sagen, dass die Referenz nicht existiert. Einnull
Wert hat einen definierten Verweis auf "nichts". Wenn Sie eine nicht vorhandene Eigenschaft eines Objekts aufrufen, erhalten Sieundefined
. Wenn ich diese Eigenschaft absichtlich leer machen würde, dann muss esnull
so sein, dass Sie wissen, dass es absichtlich ist.TLDR; Verwenden Sie nicht das
undefined
Grundelement. Dies ist ein Wert, den der JS-Compiler automatisch für Sie festlegt, wenn Sie Variablen ohne Zuweisung deklarieren oder wenn Sie versuchen, auf Eigenschaften von Objekten zuzugreifen, für die es keine Referenz gibt. Verwendennull
Sie diese Option nur dann, wenn Sie absichtlich möchten, dass eine Variable "keinen Wert" hat.Ich habe nie explizit etwas auf undefiniert gesetzt (und ich bin in den vielen Codebasen, mit denen ich interagiert habe, nicht darauf gestoßen). Auch benutze ich selten
null
. Ich verwendenull
nur dann, wenn ich den Wert eines Arguments für eine Funktion als wertlos bezeichnen möchte, dh:quelle
undefiniert ist, wo keine Vorstellung von der Sache existiert; Es hat keinen Typ und wurde in diesem Bereich noch nie referenziert. Bei null ist bekannt, dass das Ding existiert, aber es hat keinen Wert.
quelle
Jeder hat seine eigene Codierungsmethode und seine eigene interne Semantik, aber im Laufe der Jahre habe ich festgestellt, dass dies der intuitivste Rat ist, den ich Leuten gebe, die diese Frage stellen: Wenn Sie Zweifel haben, tun Sie, was JavaScript tut .
Angenommen, Sie arbeiten mit Objekteigenschaften wie Optionen für ein jQuery-Plugin. Fragen Sie sich, welchen Wert JavaScript für eine Eigenschaft hat, die noch definiert werden muss. Die Antwort lautet
undefined
. In diesem Zusammenhang würde ich diese Art von Dingen mit 'undefined' initialisieren, um mit JavaScript konsistent zu sein (für Variablen können Sie diesvar myVar;
anstelle von tunvar myVar = undefined;
).Angenommen, Sie führen eine DOM-Manipulation durch. Welchen Wert weist JavaScript nicht vorhandenen Elementen zu? Die Antwort lautet
null
. Dies ist der Wert, mit dem ich initialisieren würde, wenn Sie eine Platzhaltervariable erstellen, die später einen Verweis auf ein Element, ein Dokumentfragment oder ähnliches enthält, das sich auf das DOM bezieht.Wenn Sie mit JSON arbeiten, muss ein Sonderfall erstellt werden: Für undefinierte Eigenschaftswerte sollten Sie diese entweder festlegen
""
odernull
weil ein Wert vonundefined
nicht als geeignetes JSON-Format angesehen wird.Wenn Sie feststellen, dass Sie Dinge mit
null
oderundefined
mehr als einmal in einem blauen Mond initialisieren , sollten Sie vielleicht überlegen, wie Sie Ihre App codieren.quelle
Sie könnten die hier vorgeschlagene Konvention übernehmen, aber es gibt wirklich keinen guten Grund dafür. Es wird nicht konsequent genug verwendet, um sinnvoll zu sein.
Um die Konvention nützlich zu machen, müssen Sie zunächst wissen, dass die aufgerufene Funktion der Konvention folgt. Dann müssen Sie den zurückgegebenen Wert explizit testen und entscheiden, was zu tun ist. Wenn Sie undefiniert werden , können Sie davon ausgehen, dass ein Fehler aufgetreten ist , von dem die aufgerufene Funktion wusste . Aber wenn ein Fehler aufgetreten ist und die Funktion davon wusste und es nützlich ist, diesen an die weitere Umgebung zu senden, warum nicht ein Fehlerobjekt verwenden? dh einen Fehler werfen?
Letztendlich ist die Konvention in nichts anderem als in sehr kleinen Programmen in einfachen Umgebungen praktisch nutzlos.
quelle
Eine nützliche Eigenschaft in null , die nicht definiert ist, ist nicht qualifiziert:
Ich verwende,
null
wenn ich einen numerischen Wert "ausschalten" oder einen initialisieren möchte. Meine letzte Verwendung war die Manipulation der CSS-Transformation:Nicht sicher , ob ich sollte diese Eigenschaft Gedanken verwenden ...
quelle
DOM-Knoten und -Elemente sind nicht undefiniert, können jedoch null sein.
Das nextSibling des letzten untergeordneten Elements eines Elements ist null.
Das vorherige Geschwister des ersten Kindes ist null.
Eine document.getElementById-Referenz ist null, wenn das Element im Dokument nicht vorhanden ist.
In keinem dieser Fälle ist der Wert jedoch undefiniert . Es gibt dort einfach keinen Knoten.
quelle
window.myVar
zurückgegeben, wenn sie nicht vorhanden ist. Es gibt Unmengen von Dingen, die in JavaScript "undefiniert" zurückgeben, nur Unmengen von Dingen, die "null" zurückgeben - alles hängt vom Kontext ab.Einige haben gesagt, dass es in Ordnung ist, Objekte zu initialisieren
null
. Ich wollte nur darauf hinweisen, dass die Standardeinstellungen für destrukturierende Argumente nicht funktionierennull
. Beispielsweise:Dies erfordert die Durchführung von
null
Überprüfungen vor dem Aufruf der Funktion, was häufig vorkommen kann.quelle
Ich arbeite gerade an dieser genauen Frage und betrachte die folgende Philosophie:
Für mich ist diese Frage von Bedeutung, da jeder, der eine Funktion aufruft, die ein Ergebnis zurückgibt, keine Frage haben sollte, ob er auf undefiniert gegen null testen soll.
Diese Antwort versucht nicht zu adressieren:
Meiner Meinung nach sind Variablen Ihr eigenes Geschäft und kein Teil Ihrer API, und Eigenschaften in jedem OO-System sind definiert und sollten daher mit einem anderen Wert definiert werden, als wenn sie nicht definiert wären (null für definiert, undefiniert ist das, was Sie sind erhalten, wenn Sie auf etwas zugreifen, das sich nicht in Ihrem Objekt befindet).
quelle
Hier ist ein Grund:
var undefined = 1
Ist legal Javascript, ist abervar null = 1
ein Syntaxfehler. Der Unterschied besteht darin, dassnull
es sich um ein Sprachschlüsselwortundefined
handelt, aus irgendeinem Grund jedoch nicht.Wenn sich Ihr Code auf Vergleiche stützt,
undefined
als ob es sich um ein Schlüsselwort handelt (if (foo == undefined)
ein sehr einfacher Fehler), das nur funktioniert, weil niemand eine Variable mit diesem Namen definiert hat. Der gesamte Code ist anfällig für Personen, die versehentlich oder böswillig eine globale Variable mit diesem Namen definieren. Natürlich wissen wir alle, dass es in Javascript völlig unmöglich ist, versehentlich eine globale Variable zu definieren ...quelle
void 0
anstelle von undefiniert.Ich möchte nur hinzufügen, dass bei Verwendung bestimmter Javascript-Bibliotheken null und undefiniert unbeabsichtigte Konsequenzen haben können.
Zum Beispiel die
get
Funktion von lodash , die einen Standardwert als drittes Argument akzeptiert:Ein weiteres Beispiel: Wenn Sie defaultProps in React verwenden und eine Eigenschaft übergeben wird
null
, werden Standard-Requisiten nicht verwendet, da null als definierter Wert interpretiert wird . z.Bquelle
Ich bin völlig anderer Meinung, dass eine Verwendung von null oder undefiniert nicht erforderlich ist. undefiniert ist etwas, das den gesamten Verkettungsprozess des Prototyps am Leben erhält. Daher kann der Compiler nur mit null nicht überprüfen, ob diese Eigenschaft nur null ist oder nicht im Endpunktprototyp definiert ist. In anderen dynamischen typisierten Sprachen (z. B. Python) wird eine Ausnahme ausgelöst, wenn Sie auf nicht definierte Eigenschaften zugreifen möchten. Bei prototypbasierten Sprachen sollte der Compiler jedoch auch übergeordnete Prototypen überprüfen. Hier ist der Ort, an dem undefinierte Sprachen am meisten benötigt werden.
Die ganze Bedeutung der Verwendung von Null besteht darin, nur eine Variable oder Eigenschaft an ein Objekt zu binden, das Singleton ist und die Bedeutung der Leere hat, und auch die Verwendung von Null hat Leistungszwecke. Diese 2 Codes haben unterschiedliche Ausführungszeiten.
quelle