If I want to test of object x
has a defined property y
regardless of x.y
's value, is there a better way that the rather clunky:
if ( typeof(x.y) != 'undefined' ) ...
?
If I want to test of object x
has a defined property y
regardless of x.y
's value, is there a better way that the rather clunky:
if ( typeof(x.y) != 'undefined' ) ...
?
If you are testing for properties that are on the object itself (not a part of its prototype chain) you can use .hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
You can use the in
operator to test for properties that are inherited as well.
if ('y' in x) {
// ......
}
You can trim that up a bit like this:
if ( x.y !== undefined ) ...
If you want to know if the object physically contains the property @gnarf's answer using hasOwnProperty
will do the work.
If you're want to know if the property exists anywhere, either on the object itself or up in the prototype chain, you can use the in
operator.
if ('prop' in obj) {
// ...
}
Eg.:
var obj = {};
'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
One feature of my original code
if ( typeof(x.y) != 'undefined' ) ...
that might be useful in some situations is that it is safe to use whether x
exists or not. With either of the methods in gnarf's answer, one should first test for x
if there is any doubt if it exists.
So perhaps all three methods have a place in one's bag of tricks.