Consider the code below. The first console.log
correctly logs the image, and you can see its properties in the image below. However, when I try logging one if its properties to the console, I get undefined
!
console.log(that.data[0].cards); //works -- see image below
console.log(that.data[0].cards.E); //undefined
console.log(that.data[0].cards['E']); //undefined
console.log(that.data[0].cards.hasOwnProperty('E')); //false
var test = JSON.stringify(that.data[0]);
console.log(test); // {}
for( var key in that.data[0].cards ) {
console.log('hello????') //doesn't appear in the console
}
console.log( Object.keys( that.data[0].cards ) ); //[]
console.log( that.data[0].cards.propertyIsEnumerable("E") ); //false
console.log( that.data[0].cards.__lookupGetter__( "E" ) ); //undefined
The result in the console:
Any idea what's going on here? The xml
property inside of that.data[0]
should also have properties inside of it -- named the same, in fact, as the properties in cards
.
FWIW, I get the same thing in Firebug (the above console image is Chrome).
A variable that has not been assigned a value is of type undefined . A method or statement also returns undefined if the variable that is being evaluated does not have an assigned value. A function returns undefined if a value was not returned .
The JavaScript warning "reference to undefined property" occurs when a script attempted to access an object property which doesn't exist.
Use the strict equality (===) operator to check if an object property is undefined, e.g. if (obj. age === undefined) {} . The strict equality operator will return true if the property is undefined and false otherwise. Copied!
The typeof operator for undefined value returns undefined . Hence, you can check the undefined value using typeof operator. Also, null values are checked using the === operator.
I've solved the problem. Basically, the object in question (that.data[0].cards
) has its properties created by a function a()
that runs after all the AJAX requests for the necessary XML files have been processed. I allow the requests to run asynchronously, using a counter to determine in the success
callback function if a()
should be called yet.
After a()
runs, function b()
is supposed to perform operations on that.data[i].cards
. However, b()
was running prior to a()
being called because of a()
's reliance on the asynchronous requests. So the solution was simply to make a()
call b()
.
So this turned out to be a pretty simple mistake on my part. What made it so confusing was the fact that logging that.data[0].cards
to the console showed me that in fact the cards
object had already been built, when in fact it had not yet. So the console was providing me with incorrect--or at least unclear--information.
Thanks for everyone's help last night! Upvotes all around :)
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