Site Overlay

Verstehen von Null und Undefiniert in JavaScript

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 90geä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

  1. Wenn x null und y undefiniert ist, geben Sie true zurück.
  2. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.