Organizational Research By

Surprising Reserch Topic

How to I check if an object has a property in JavaScript?

How do I check if an object has a property in JavaScript?


x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this

Is that the best way to do that?


asked Jun 30, 2015 in JAVASCRIPT by rajesh
0 votes

Related Hot Questions

2 Answers

0 votes
I'm really confused by the answers that have been given - most of them are just outright incorrect. Of course you can have object properties that have undefined, null, or false values. So simply reducing the property check to typeof this[property] or, even worse, x.key will give you completely misleading results.

It depends on what you're looking for. If you want to know if an object physically contains a property (and it is not coming from somewhere up on the prototype chain) then object.hasOwnProperty is the way to go. All modern browsers support it. (It was missing in older versions of Safari - 2.0.1 and older - but those versions of the browser are rarely used any more.)

If what you're looking for is if an object has a property on it that is iterable (when you iterate over the properties of the object, it will appear) then doing: prop in object will give you your desired effect.

Since using hasOwnProperty is probably what you want, and considering that you may want a fallback method, I present to you the following solution:

var obj = {
    a: undefined,
    b: null,
    c: false

// a, b, c all found
for ( var prop in obj ) {
    document.writeln( "Object1: " + prop );

function Class(){
    this.a = undefined;
    this.b = null;
    this.c = false;

Class.prototype = {
    a: undefined,
    b: true,
    c: true,
    d: true,
    e: true

var obj2 = new Class();

// a, b, c, d, e found
for ( var prop in obj2 ) {
    document.writeln( "Object2: " + prop );

function hasOwnProperty(obj, prop) {
    var proto = obj.__proto__ || obj.constructor.prototype;
    return (prop in obj) &&
        (!(prop in proto) || proto[prop] !== obj[prop]);

if ( Object.prototype.hasOwnProperty ) {
    var hasOwnProperty = function(obj, prop) {
        return obj.hasOwnProperty(prop);

// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
    if ( hasOwnProperty(obj2, prop) ) {
        document.writeln( "Object2 w/ hasOwn: " + prop );
The above is a working, cross-browser, solution to hasOwnProperty, with one caveat: It is unable to distinguish between cases where an identical property is on the prototype and on the instance - it just assumes that it's coming from the prototype. You could shift it to be more lenient or strict, based upon your situation, but at the very least this should be more helpful.
answered Jun 30, 2015 by rajesh
0 votes

With Underscore.js or (even better) lodash:

_.has(x, 'key');

Which calls Object.prototype.hasOwnProperty, but (a) is shorter to type, and (b) uses "a safe reference to hasOwnProperty" (i.e. it works even if hasOwnProperty is overwritten).

In particular, lodash defines _.has as:

   function has(object, key) {
      return object ?, key) : false;
   // hasOwnProperty = Object.prototype.hasOwnProperty
answered Jun 30, 2015 by rajesh