Null vs. Undefined
gratis youtube-video om emnet
JavaScript (og i forlængelse TypeScript) har to nederste typer : null
og undefined
. De er beregnet til at betyde forskellige ting:
-
noget er ikke initialiseret :
undefined
. -
noget er i øjeblikket ikke tilgængeligt:
null
.
faktum er, at du bliver nødt til at håndtere begge dele. Interessant i JavaScript med ==
null
og undefined
er kun lig med hinanden:
// Both null and undefined are only `==` to themselves and each other:console.log(null == null); // true (of course)console.log(undefined == undefined); // true (of course)console.log(null == undefined); // true// You don't have to worry about falsy values making through this checkconsole.log(0 == undefined); // falseconsole.log('' == undefined); // falseconsole.log(false == undefined); // false
Anbefal == null
for at kontrollere for begge undefined
eller null
. Du ønsker generelt ikke at skelne mellem de to.
function foo(arg: string | null | undefined) {if (arg != null) {// arg must be a string as `!=` rules out both null and undefined.}}
Du kan også gøre
== undefined
, men== null
er mere konventionel/kortere.
en undtagelse, rodniveau undefined
værdier, som vi diskuterer næste.
kontrol af rodniveau udefineret
husk, hvordan jeg sagde, at du skulle bruge == null
? Selvfølgelig gør du det (fordi jeg lige sagde det ^). Brug det ikke til rodniveau ting. I streng tilstand, hvis du brugerfoo
ogfoo
er udefineret, får du enReferenceError
undtagelse, og hele opkaldsstakken afvikles.
Du skal bruge streng tilstand … og faktisk vil TS-kompilatoren indsætte den for dig, hvis du bruger moduler … mere om dem senere i bogen, så du ikke behøver at være eksplicit om det 🙂
så for at kontrollere, om en variabel er defineret eller ikke på globalt plan, bruger du normalt typeof
:
if (typeof someglobal !== 'undefined') {// someglobal is now safe to useconsole.log(someglobal);}
begræns eksplicit brug af Undefined
fordi TypeScript giver dig mulighed for at dokumentere dine strukturer adskilt fra værdier i stedet for ting som:
function foo(){// if Somethingreturn {a:1,b:2};// elsereturn {a:1,b:undefined};}
Du skal bruge en type annotation:
function foo():{a:number,b?:number}{// if Somethingreturn {a:1,b:2};// elsereturn {a:1};}
node style tilbagekaldsfunktioner (f.eks. (err,somethingElse)=>{ /* something */ }
) kaldes generelt med err
Indstil til null
hvis der ikke er en fejl. Du bruger generelt bare en truthy check for dette alligevel:
fs.readFile('someFile', 'utf8', (err,data) => { if (err) { // do something } else { // no error }});
fs.readFile('someFile', 'utf8', (err,data) => {if (err) {// do something} else {// no error}});
Når du opretter dine egne API ‘ er, er det okay at brugenull
i dette tilfælde for konsistens. I al oprigtighed for dine egne API ‘ er skal du se på løfter, i så fald behøver du faktisk ikke gider med fraværende fejlværdier (du håndterer dem med .then
vs. .catch
).
brug ikke udefineret som et middel til at betegne gyldighed
for eksempel en forfærdelig funktion som denne:
function toInt(str: string) {return str ? parseInt(str) : undefined;}
kan skrives meget bedre som dette:
function toInt(str: string): { valid: boolean, int?: number } {const int = parseInt(str);if (isNaN(int)) {return { valid: false };}else {return { valid: true, int };}}
JSON og serialisering
JSON-standarden har understøttelse af kodning null
men ikke undefined
. Når JSON-koder et objekt med en attribut, der er null
, vil attributten blive inkluderet med dens null-værdi, mens en attribut med en undefined
værdi udelukkes helt.
JSON.stringify({willStay: null, willBeGone: undefined}); // {"willStay":null}
som følge heraf kan JSON-baserede databaser understøttenull
værdier men ikkeundefined
værdier. Da attributter indstillet til null
er kodet, kan du overføre hensigten om at rydde en attribut ved at indstille dens værdi til null
før kodning og transmission af objektet til en fjernbutik.
Indstilling af attributværdier til undefined kan spare på lager-og transmissionsomkostninger, da attributnavnene ikke kodes. Dette kan dog komplicere semantikken for clearingværdier vs. fraværende værdier.
Endelige tanker
TypeScript team bruger ikkenull
: retningslinjer for TypeScript-kodning, og det har ikke forårsaget nogen problemer. Douglas Crockford tænker null
er en dårlig ide, og vi skal alle bare brugeundefined
.
NodeJS-stilkodebaser bruger dognull
til Fejlargumenter som standard, da det betegnerSomething is currently unavailable
. Jeg er personligt ligeglad med at skelne mellem de to, da de fleste projekter bruger biblioteker med forskellige meninger og bare udelukker begge med == null
.