Før du dykker dybere, lad os først dække det grundlæggende:
undefined
returneres, hvis en variabel kun var erklæret, men ikke er tildelt en værdi.
For eksempel:
var ab
Dette vil logge undefined
:
log(ab)
undefined variable er variable, der er uden værdier., Lad os sige, at miljøet er repræsenteret som dette:
environmentVariable = {}
JS engine ville fortolke VariableDeclaration var ab
som:
environmentVariable = {
ab: undefined
}
Så når det er adgang til den undefined
vil blive returneret., Nu, når ab
er tildelt en værdi:
ab = 90
undefined
vil blive ændret til den værdi 90
:
environmentVariable = {
ab: 90
}
Når vi erklærede ab
det var angivet i miljøvariablen tabellen som undefined
, som betyder, at den værdi, der er på den måde, når nu vi ab til værdi 90
undefined
blev ændret til 90
.,ab207″>
undefined
kan også opstå, hvis et objekts egenskab findes ikke
let myDetails = {
age: 27
}log(myDetails.name)
// undefined
eller en funktion har en manglende parameter:
function getMyDetails(a) {
l(a)
}getMyDetails()
// undefined
undefined
er en primitiv data type i JS:
Boolean
Undefined
Number
String
Symbolvar ab
typeof ab
// undefined
Du kan kontrollere, om den type ved hjælp af typeof
søgeord:
if(typeof ab == 'undefined') {
// ...
}
undefined
kan angives eksplicit:
var ab = undefined
l(ab)
// undefinedab = 90
l(ab)
// 90
null
null
er en datatype i JS, der erklærer nogen værdi eller ikke-eksisterende værdi., null kan betragtes som et forsætligt fravær af nogen objektværdi.
var ab = null
l(ab)
// null
Ligheder
Lad os se på deres ligheder.
begge er falsy-værdier
null
og undefined
løser altid til en falsk værdi., De er blandt de falsy værdier i JS:
- null
- udefineret
- false
- 0
- Tom streng -> “”
- NaN
Hvis de er i den tilstand af en if-else
erklæring, else-sætning vil altid udføres:
if (null) {
l('yes')
} else {
l('no')
}
ovenstående vil log “nej”.
if (undefined) {
l('yes')
} else {
l('no')
}
vil også logge “Nej”.,
Både er primitive værdier
I JS vi har Komplekse og Primitive data-typer, null og udefineret er blandt de primitive data-typer:
- null
- udefineret
- Symbol
- String
- Antal
- Boolean
Primitive data-typer er løst ved value-for-reference.
forskelle
null
ogundefined
betyder ingen værdi, men de løser problemet. værdier:
l(typeof null)
// objectl(typeof undefined)
// undefined
du forventede typeof null
ville returnere “null”? Ikke?, Dette er en fejl i JS i næsten to årtier, men sagen er, at den ikke kan løses. Dette skyldes, at tusinder af websebsteder er afhængige af denne buggy-opførsel, fastsættelse af det vil få dem til at gå i stykker.
null
er en tildelt værdi, den skal udtrykkeligt tildeles af programmøren., HVIS ikke, der er tildelt variablen bliver undefined
:
var ab = null
var a // undefined
i modsætning til ikke-defineret som kan være udtrykkeligt er tildelt eller ikke-tildelt:
var ab = undefined
var bc l(ab)
// undefinedl(bc)
// undefined
Test for null
så Vi, at undefined
beslutter at “undefined”, men null
beslutter at “objekt”.,
Vi kan nemt teste for undefined
:
var abif(typeof ab == "undefined") {
// ...
}
null
, vi kan ikke gøre dette:
var ab = nullif(typeof ab == "null") {
// ...
}
typeof null
returnerer “objekt”, og vi kan være fristet til at omskrive ovenstående som dette:
var ab = nullif(typeof ab == "object") {
// ...
}
Mange Komplekse data typer vende tilbage objekter, den type, som kan kontrolleres via typeof
:
let obj = {}
let arr =
class D {}
const d = new D()l(typeof obj)
l(typeof arr)
l(typeof d)// object
// object
// object
Så det ville mislykkes, fordi et Array eller en Genstand kan være værdien af ab.,
hvordan tester vi korrekt for null, da null er en falsk værdi, kombinerer vi dens kontrol med typenaf check.
var ab = nullif(!ab && typeof ab == "object") {
// ...
}
Abstract/Løs og Strenge Ligestilling på null og udefineret
Lad os se, hvad der sker, når en stram og løs ligestilling er udført på begge typer. Men før det-en hurtig gennemgang af den løse ligestillingsspecifikation:
7.2.14 abstrakt Ligestillingssammenligning
sammenligningen = = = y, hvor and og y er værdier, producerer sandt eller falsk., En sådan sammenligning udføres som følger:
se på 2 og 3
- hvis If er null og y er udefineret, returner true.
- hvis true er udefineret og y er null, returner true.
2 siger, at hvis LHS er null, og RHS er udefineret, returneres true., Dette er grunden til, hvis vi gør dette:
log(null == undefined)
det logs true
log(null == undefined)
// true
og siger, at hvis LHS er udefineret, og RHS er null, skal det også returnere true
log(undefined == null)
// true
Dette betyder, at der kan være nul og udefineret er løst lige, ja, det er forståeligt, fordi de alle repræsenterer et fravær af ingen værdi, som i en nøgle-værdi-par, nøglen er til stede, men værdien er ikke til stede/ ikke er til stede.
lad os se om streng ligestilling:
7.2.,15 streng Ligestillingssammenligning
sammenligningen = = = = y, hvor and og y er værdier, producerer sandt eller falsk. En sådan sammenligning er udført som følger:
kigger på ovenstående, strenge ligestilling returnerer false, hvis de RHS og LHS typer er forskellige.
Nu, i tilfælde af
null === undefined
Dette vil være falske, fordi de typer, der vil være object
og undefined
se de er forskellige, så det vil return false.
log(null === undefined)
så,
null !== undefined
vil være sandt. Hvorfor?, Det skyldes, at null => object
ikke er den samme type somundefined => undefined
.
null != undefined
dette spørger, om LHS ikke er lig med RHS. Dette er ikke, de er lige, fordi Abstrakt Lighed siger at returnere sand(de er ens), hvis LHS er enten null
eller undefined
og RHS er enten null
eller undefined
.,
Passing null og ikke defineret som en funktion argument
Vi skal være forsigtig, når erklære default argument værdi som dette:
function defFunc(name = "nnamdi") {
return name
}
Denne funktion kun returnerer et navn, der videregives til det, se argumentet name
har en default værdi nnamdi
argumentet vil tage nnamdi
som værdi, når funktionen kaldes uden parametre:
log(defFunc())
// nnamdi
Det kan siges sådan, når argumentet navn er udefineret det forudsætter nnamdi
værdi., Så hvis vi passerer en udefineret værdi defFunc
navn vil være nnamdi
:
var ab
log(defFunc(ab))
// nnamdi
Nu, hvad sker der, hvis vi går i nul-til den funktion? Tror du, at det vil logge nnamdi, fordi null betyder fraværet af en værdi, eller vil den logge null, fordi null er en værdi? Lad os se:
log(defFunc(null))
// null
Wowo!!! det logget null. Det skal skyldes, at null er et objekt. Jeg vil sige et tomt objekt, men stadig repræsenterer fraværet af en værdi(er).,
Hvis du prøver at kontrollere, om null argument, husk don;t gøre dette:
function defFunc(name = "nnamdi") {
if(typeof name == "null")
return "nnamdi"
return name
}
gøre dette:
function defFunc(name = "nnamdi") {
if(!name && typeof name == "object")
return "nnamdi"
return name
}
eller du kan uddelegere null check til en funktion:
function isNull(val) {
return !val && typeof val == "object"
}
du kan bruge isNull
funktion hvor som helst i dit program:
function defFunc(name = "nnamdi") {
if(isNull(name))
return "nnamdi"
return name
}
Konklusion
jeg tror, vi er klar på forskelle og ligheder mellem null
og undefined
. Så når du næste gang ser den fejl, vil du vide, hvad du skal gøre.