What\'s the best way of checking if an object property in JavaScript is undefined?
What does this mean: "undefined object property"?
Actually it can mean two quite different things! First, it can mean the property that has never been defined in the object and, second, it can mean the property that has an undefined value. Let's look at this code:
var o = { a: undefined }
Is o.a
undefined? Yes! Its value is undefined. Is o.b
undefined? Sure! There is no property 'b' at all! OK, see now how different approaches behave in both situations:
typeof o.a == 'undefined' // true
typeof o.b == 'undefined' // true
o.a === undefined // true
o.b === undefined // true
'a' in o // true
'b' in o // false
We can clearly see that typeof obj.prop == 'undefined'
and obj.prop === undefined
are equivalent, and they do not distinguish those different situations. And 'prop' in obj
can detect the situation when a property hasn't been defined at all and doesn't pay attention to the property value which may be undefined.
1) You want to know if a property is undefined by either the first or second meaning (the most typical situation).
obj.prop === undefined // IMHO, see "final fight" below
2) You want to just know if object has some property and don't care about its value.
'prop' in obj
x.a === undefined
or this typeof x.a == 'undefined'
raises ReferenceError: x is not defined
if x is not defined.undefined
is a global variable (so actually it is window.undefined
in browsers). It has been supported since ECMAScript 1st Edition and since ECMAScript 5 it is read only. So in modern browsers it can't be redefined to true as many authors love to frighten us with, but this is still a true for older browsers.obj.prop === undefined
vs typeof obj.prop == 'undefined'
Pluses of obj.prop === undefined
:
undefined
Minuses of obj.prop === undefined
:
undefined
can be overridden in old browsersPluses of typeof obj.prop == 'undefined'
:
Minuses of typeof obj.prop == 'undefined'
:
'undefned'
(misspelled) here is just a string constant, so the JavaScript engine can't help you if you have misspelled it like I just did.Node.js supports the global variable undefined
as global.undefined
(it can also be used without the 'global' prefix). I don't know about other implementations of server-side JavaScript.