为什么这个对象属性未定义?

时间:2011-10-27 20:51:45

标签: javascript object undefined object-properties

请考虑以下代码。第一个console.log正确记录图像,您可以在下面的图像中看到它的属性。但是,当我尝试将其属性记录到控制台时,我得到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

控制台中的结果:

enter image description here

知道这里发生了什么吗? xml内的that.data[0]属性也应该包含其中的属性 - 实际上与cards中的属性一样命名。

FWIW,我在Firebug中得到了同样的东西(上面的控制台图像是Chrome)。

2 个答案:

答案 0 :(得分:12)

我已经解决了这个问题。基本上,有问题的对象(that.data[0].cards)具有由函数a()创建的属性,该函数在处理了所有必需XML文件的AJAX请求之后运行。我允许请求以异步方式运行,使用计数器在success回调函数中确定是否应该调用a()

a()运行后,函数b()应该在that.data[i].cards上执行操作。但是,b()在调用a()之前运行,因为a()依赖于异步请求。因此解决方案只是让a()调用b()

所以这对我来说是一个非常简单的错误。让它如此混乱的原因是,向控制台记录that.data[0].cards向我展示了事实上已经构建了cards对象,而事实上它还没有。因此,控制台向我提供了不正确的 - 或至少不清楚的信息。

昨晚感谢大家的帮助!赞成四处:)

答案 1 :(得分:7)

我认为对象键具有不可打印的字符,可以像这样复制:

var obj = {};
obj["E"+String.fromCharCode(15)] = new Array(15);

console.log(obj);

/*Object
E: Array[15]
__proto__: Object*/

console.log(obj.E)

//undefined

console.log( obj["E"+String.fromCharCode(15)] )

//[]

编辑:您可以看到对象键是否属于这种情况:

var realKeys = [];

for( var key in obj ) {
realKeys.push( [].slice.call( key ).map( function(v){return v.charCodeAt(0);} ).join(" ") );
}

//["69 15"] (69 stands for the letter "E" and 15 was the unprintable character I added manually)

Edit2:由于你不能这样做,我想出了另一种方法,看看是否有不可打印的字符:

像这样密码密钥字符串:(在两端尽可能多地使用,以便选择任何不可见的字符)

然后像这样转储你的剪贴板(确保使用双引号):