What is the most appropriate way to test if a variable is undefined in JavaScript?
I've seen several possible ways:
if (window.myVariable)
Or
if (typeof(myVariable) != "undefined")
Or
if (myVariable) // This throws an error if undefined. Should this be in Try/Catch?
In a JavaScript program, the correct way to check if an object property is undefined is to use the typeof operator. If the value is not defined, typeof returns the 'undefined' string.
If you want to check if x is strictly equal to undefined regardless of whether is has been declared or not, you should use typeof x === 'undefined' .
The == comparison operator doesn't check the types. null and undefined both return false . That's why your code is actually checking if false is equal to false . However their types are not equal.
myVariable is declared and not yet assigned with a value. Accessing the variable evaluates to undefined . An efficient approach to solve the troubles of uninitialized variables is whenever possible assign an initial value. The less the variable exists in an uninitialized state, the better.
If you are interested in finding out whether a variable has been declared regardless of its value, then using the in
operator is the safest way to go. Consider this example:
// global scope var theFu; // theFu has been declared, but its value is undefined typeof theFu; // "undefined"
But this may not be the intended result for some cases, since the variable or property was declared but just not initialized. Use the in
operator for a more robust check.
"theFu" in window; // true "theFoo" in window; // false
If you are interested in knowing whether the variable hasn't been declared or has the value undefined
, then use the typeof
operator, which is guaranteed to return a string:
if (typeof myVar !== 'undefined')
Direct comparisons against undefined
are troublesome as undefined
can be overwritten.
window.undefined = "foo"; "foo" == undefined // true
As @CMS pointed out, this has been patched in ECMAScript 5th ed., and undefined
is non-writable.
if (window.myVar)
will also include these falsy values, so it's not very robust:
false 0 "" NaN null undefined
Thanks to @CMS for pointing out that your third case - if (myVariable)
can also throw an error in two cases. The first is when the variable hasn't been defined which throws a ReferenceError
.
// abc was never declared. if (abc) { // ReferenceError: abc is not defined }
The other case is when the variable has been defined, but has a getter function which throws an error when invoked. For example,
// or it's a property that can throw an error Object.defineProperty(window, "myVariable", { get: function() { throw new Error("W00t?"); }, set: undefined }); if (myVariable) { // Error: W00t? }
I personally use
myVar === undefined
Warning: Please note that ===
is used over ==
and that myVar
has been previously declared (not defined).
I do not like typeof myVar === "undefined"
. I think it is long winded and unnecessary. (I can get the same done in less code.)
Now some people will keel over in pain when they read this, screaming: "Wait! WAAITTT!!! undefined
can be redefined!"
Cool. I know this. Then again, most variables in Javascript can be redefined. Should you never use any built-in identifier that can be redefined?
If you follow this rule, good for you: you aren't a hypocrite.
The thing is, in order to do lots of real work in JS, developers need to rely on redefinable identifiers to be what they are. I don't hear people telling me that I shouldn't use setTimeout
because someone can
window.setTimeout = function () { alert("Got you now!"); };
Bottom line, the "it can be redefined" argument to not use a raw === undefined
is bogus.
(If you are still scared of undefined
being redefined, why are you blindly integrating untested library code into your code base? Or even simpler: a linting tool.)
Also, like the typeof
approach, this technique can "detect" undeclared variables:
if (window.someVar === undefined) { doSomething(); }
But both these techniques leak in their abstraction. I urge you not to use this or even
if (typeof myVar !== "undefined") { doSomething(); }
Consider:
var iAmUndefined;
To catch whether or not that variable is declared or not, you may need to resort to the in
operator. (In many cases, you can simply read the code O_o).
if ("myVar" in window) { doSomething(); }
But wait! There's more! What if some prototype chain magic is happening…? Now even the superior in
operator does not suffice. (Okay, I'm done here about this part except to say that for 99% of the time, === undefined
(and ****cough**** typeof
) works just fine. If you really care, you can read about this subject on its own.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With