views:

10875

answers:

3

How do I check if a particular key exists in a Javascript associative array?

If a key doesn't exist and I try to access it, will it return false? Or throw an error?

+8  A: 

It will return undefined.

var aa = {hello: "world"};
alert( aa["hello"] );      // popup box with "world"
alert( aa["goodbye"] );    // popup boc with "undefined"

undefined is a special constant value. So you can say, e.g.

// note the three equal signs so that null won't be equal to undefined
if( aa["goodbye"] === undefined ) {
    // do something
}

This is probably the best way to check for missing keys. However, as is pointed out in a comment below, it's theoretically possible that you'd want to have the actual value be undefined. I've never needed to do this and can't think of a reason offhand why I'd ever want to, but just for the sake of completeness, you can use the in operator

// this works even if you have {"goodbye": undefined}
if( "goodbye" in aa ) {
    // do something
}
Eli Courtwright
Yes. It returns undefined whether it is created as an object or an array.
Nosredna
What if the key exists but the value is actually undefined?
Ates Goral
You should use === instead of == when comparing to undefined, otherwise null will compare equal to undefined.
Matthew Crumley
@Matthew: thanks for the tip; I've edited my response to change == to ===.
Eli Courtwright
+31  A: 

Actually, checking for undefined-ness is not an accurate way of testing whether a key exists. What if the key exists but the value is actually undefined?

var obj = { key: undefined };
obj["key"] != undefined // false, but the key exists!

You should instead use the in operator:

"key" in obj // true, regardless of the actual value

Or, if you want to particularly test for properties of the object instance (and not inherited properties), use hasOwnProperty:

obj.hasOwnProperty("key") // true
Ates Goral
Having a property with a manually defined value of undefined makes absolutely no sense. It would be an oxymoron really.
joebert
I'm convinced that there are use cases for having properties intentionally set to undefined.
Ates Goral
Valid use case: Gecko 1.9.1 [Firefox 3.5] has no window.onhashchange property. Gecko 1.9.2 [Firefox 3.6] has this property set to undefined (until the hash changes). To feature detect the hash history or the browser version, one must use window.hasOwnProperty("onhashchange");
SamGoody
A: 

Of course there are uses for "undefining" a variable. If your logic hinges on its being defined, then you would create an irreversible condition if undefining were disallowed. That would be like saying a Boolean can start out as False, but once True must remain True.

nstone