Bevor wir tiefer eintauchen, behandeln wir zunächst die Grundlagen:
undefined
wird zurückgegeben, wenn eine Variable nur deklariert, aber nicht zugewiesen wurde ein Wert.
Zum Beispiel:
var ab
Dies protokolliert undefined
:
log(ab)
undefinierte Variablen sind Variablen, die keine Werte haben., Angenommen, die Umgebung wird wie folgt dargestellt:
environmentVariable = {}
JS engine würde die VariableDeclaration var ab
interpretieren als:
environmentVariable = {
ab: undefined
}
Wenn auf sie zugegriffen wird, wird die undefined
zurückgegeben., Wenn nun der ab
ein Wert zugewiesen wird:
ab = 90
wird die undefined
in den Wert 90
:
environmentVariable = {
ab: 90
}
Wenn wir ab
es wurde in der Umgebungsvariablentabelle als undefined
gesetzt, was bedeutet, dass der Wert auf dem Weg ist, jetzt, wenn wir zu value 90
wechseln, wurde die undefined
in 90
geändert.,ab207″>
undefined
kann auch auftreten, wenn die Eigenschaft eines Objekts nicht vorhanden ist
let myDetails = {
age: 27
}log(myDetails.name)
// undefined
oder eine Funktion einen fehlenden Parameter hat:
function getMyDetails(a) {
l(a)
}getMyDetails()
// undefined
undefined
ist ein primitiver Datentyp in JS:
Boolean
Undefined
Number
String
Symbolvar ab
typeof ab
// undefined
Mit typeof
Schlüsselwort:
if(typeof ab == 'undefined') {
// ...
}
undefined
kann explizit gesetzt werden:
var ab = undefined
l(ab)
// undefinedab = 90
l(ab)
// 90
null
null
ist ein Datentyp in JS, der keinen Wert oder keinen nicht vorhandenen Wert deklariert., null kann als absichtliches Fehlen eines Objektwerts angesehen werden.
var ab = null
l(ab)
// null
Ähnlichkeiten
Schauen wir uns ihre Ähnlichkeiten an.
Beide sind falsche Werte
null
und undefined
wird immer in einen falschen Wert aufgelöst., Sie gehören zu den falschen Werten in JS:
- null
- undefined
- false
- 0
- Leere Zeichenfolge -> „“
- NaN
Wenn sie sich im Zustand einer if-else
– Anweisung befinden, wird die else-Anweisung immer ausgeführt:
if (null) {
l('yes')
} else {
l('no')
}
Das obige protokolliert „nein“.
if (undefined) {
l('yes')
} else {
l('no')
}
log auch „Nein“.,
Beide sind primitive Werte
In JS haben wir komplexe und primitive Datentypen, null und undefined gehören zu den primitiven Datentypen:
- null
- undefined
- Symbol
- String
- Number
- Boolean
Primitive Datentypen werden durch value-of-reference aufgelöst.
Unterschiede
null
und undefined
bedeutet das Nein-Wert, sondern Sie auflösen, um die diff. werte:
l(typeof null)
// objectl(typeof undefined)
// undefined
Sie erwarteten typeof null
würde“null“ zurückgeben? Richtig?, Dies ist ein Fehler in JS seit fast zwei Jahrzehnten, aber die Sache ist, dass es nicht behoben werden kann. Dies liegt daran, dass Tausende von Websites von diesem fehlerhaften Verhalten abhängen und sie dadurch kaputt gehen.
null
ist ein zugewiesener Wert, der vom Programmierer explizit zugewiesen werden muss., WENN nicht zugewiesen ist, wird die variable wird undefined
:
var ab = null
var a // undefined
im Gegensatz zu nicht definiert, welche explizit zugewiesen oder nicht zugewiesen:
var ab = undefined
var bc l(ab)
// undefinedl(bc)
// undefined
Test für null
Wir gesehen, dass undefined
auflöst „undefined“, aber null
auflöst „Objekt“.,
Wir können leicht testen für undefined
:
var abif(typeof ab == "undefined") {
// ...
}
Für null
, wir können nicht tun diese:
var ab = nullif(typeof ab == "null") {
// ...
}
typeof null
gibt „objekt“ und wir können versucht sein, das Obige so umzuschreiben:
var ab = nullif(typeof ab == "object") {
// ...
}
Viele komplexe Datentypen geben Objekte zurück, der Typ kann über typeof
überprüft werden:
let obj = {}
let arr =
class D {}
const d = new D()l(typeof obj)
l(typeof arr)
l(typeof d)// object
// object
// object
Es würde also fehlschlagen, weil ein Array oder Objekt der Wert von ab sein könnte.,
Wie testen wir nun korrekt auf null, da null ein falscher Wert ist, werden wir seine Überprüfung mit der typeof-Prüfung kombinieren.
var ab = nullif(!ab && typeof ab == "object") {
// ...
}
Abstract/Loose and Strict Equality on null and undefined
Mal sehen, was passiert, wenn Strict und loose für beide Typen ausgeführt werden. Aber vorher — eine kurze Überprüfung der loose equality specification:
7.2.14 Abstract Equality Comparison
Der Vergleich x == y, wobei x und y Werte sind, erzeugt true oder false., Ein solcher Vergleich wird wie folgt durchgeführt:
Schauen Sie sich 2 und 3
- Wenn x null und y undefiniert ist, geben Sie true zurück.
- Wenn x undefiniert ist und y null ist, geben Sie true zurück.
2 sagt, wenn der LHS null und der RHS undefiniert ist, wird true zurückgegeben., Wenn wir dies tun:
log(null == undefined)
protokolliert es true
log(null == undefined)
// true
und sagt, wenn das LHS undefiniert ist und das RHS null ist, sollte es auch true
log(undefined == null)
// true
Dies bedeutet, dass null und undefined lose gleich sind, ja, es ist verständlich, weil sie alle eine Abwesenheit darstellen ohne Wert, wie in einem Schlüssel-Wert-Paar, ist der Schlüssel vorhanden, aber der Wert ist nicht vorhanden/ fehlt.
Lassen Sie uns über strenge Gleichheit sehen:
7.2.,15 Strikter Gleichheitsvergleich
Der Vergleich x === y, wobei x und y Werte sind, erzeugt true oder false. Ein solcher Vergleich wird wie folgt durchgeführt:
Wenn man sich das Obige anschaut, gibt strict equality false zurück, wenn die RHS-und LHS-Typen unterschiedlich sind
Nun ist dies im Fall von
null === undefined
falsch, da die Typen object
und undefined
sind, siehe, dass sie unterschiedlich sind, sodass false zurückgegeben wird.
log(null === undefined)
Also
null !== undefined
wird wahr. Warum?, Dies liegt daran, dass null => object
nicht derselbe Typ ist wie undefined => undefined
.
null != undefined
Hier wird gefragt, ob der LHS nicht gleich dem RHS ist. Dies ist nein, sie sind gleich, da die abstrakte Gleichheit besagt, dass sie true(dass sie gleich sind), wenn der LHS entweder oder undefined
und der RHS entweder oder undefined
.,
Übergeben von null und undefiniert als Funktionsargument
Wir sollten vorsichtig sein, wenn wir den Standardargumentwert wie folgt deklarieren:
function defFunc(name = "nnamdi") {
return name
}
Diese Funktion gibt nur einen übergebenen Namen zurück, siehe das Argument name
hat einen Standardwert nnamdi
, das Argument wird nnamdi
als Wert wenn die Funktion ohne Parameter aufgerufen wird:
log(defFunc())
// nnamdi
Es kann so gesagt werden, wenn der Argumentname undefiniert ist, wird der Wert nnamdi
angenommen., Wenn wir also einen undefinierten Wert an defFunc
übergeben, lautet der Name nnamdi
:
var ab
log(defFunc(ab))
// nnamdi
Was passiert nun, wenn wir null an die Funktion übergeben? Denken Sie, es wird nnamdi protokollieren, weil null das Fehlen eines Werts bedeutet, oder wird es null protokollieren, weil null ein Wert ist? Mal sehen:
log(defFunc(null))
// null
Wow!! es ist null. Es sollte sein, weil null ein Objekt ist. Ich würde ein leeres Objekt sagen, das jedoch immer noch das Fehlen eines Wertes darstellt.,
Wenn Sie versuchen, zu prüfen, für null-argument, erinnern Sie don;t, dies zu tun:
function defFunc(name = "nnamdi") {
if(typeof name == "null")
return "nnamdi"
return name
}
do:
function defFunc(name = "nnamdi") {
if(!name && typeof name == "object")
return "nnamdi"
return name
}
, oder Sie delegieren können den null-check zu einer Funktion:
function isNull(val) {
return !val && typeof val == "object"
}
Sie können die isNull
Funktion überall in Ihrem Programm:
function defFunc(name = "nnamdi") {
if(isNull(name))
return "nnamdi"
return name
}
Fazit
ich glaube, wir sind uns im klaren über die Unterschiede und ähnlichkeiten zwischen null
und undefined
. Wenn Sie diesen Fehler als nächstes sehen, wissen Sie, was zu tun ist.