När en variabel deklareras utan att tilldelas ett värde är dess initialvärde undefined
.
Hur kontrollerar du om ett värde är undefined
i JavaScript?
Det korta svaret
I moderna webbläsare kan du säkert jämföra variabeln direkt till undefined
:
Vissa människor argumenterar mot att jämföra med undefined
eftersom gamla webbläsare tillåter att värdet tilldelas på nytt så här:
Efter den omfördelningen jämförs med undefined
skulle direkt inte längre kunna upptäcka om en variabel tilldelades ett värde.
Detta beteende fixades dock 2009 med ECMAScript 5:
I moderna webbläsare är det ” är det inte längre möjligt att tilldela det globala undefined
-värdet.
Vad händer om jag behöver stödja IE8 och äldre?
Generellt, jämför direkt med un definierad är fortfarande säker. Det finns ingen praktisk anledning till att en ansökan omfördelar värdet av undefined
.
Thomas Eding visar detta med en övertygande analogi:
Om du fortfarande är orolig finns det två sätt att kontrollera om ett värde är odefinierat även om det globala undefined
har skrivits över.
Du kan använda ogiltig operatör för att få värdet av undefined
. Detta fungerar även om det globala window.undefined
-värdet har skrivits över:
Nollan i detta exempel har ingen speciell betydelse, du kan lika gärna använda 1
eller function(){}
. void(anything)
utvärderas alltid till undefined
.
Alternativt kan du använda typen av operatör för att säkert kontrollera om ett värde tilldelades. Istället för att jämföra med det globala undefined
-värdet kontrollerar du om värdets typ är ”odefinierad”:
Observera att detta skiljer sig något från de tidigare alternativen. Även om name
inte förklarades typeof
fortfarande skulle säga att det var odefinierat. Om du jämför en odeklarerad variabel med undefined
eller void(0)
skulle du istället få en ReferenceError.
Men inte använd void (0) direkt
Undvik att använda void(0)
eller typeof x === "undefined"
ordligt i kod. Dessa uttryck är inte självförklarande och bör förpackas i en isUndefinierad funktion så här:
Många verktygsbibliotek har redan inbyggd denna funktion, till exempel finns det en _.isUndefined
-funktion i Underscore.js.