11

考虑下面的代码。第一个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

控制台中的结果:

在此处输入图像描述

知道这里发生了什么吗?xml里面的属性也that.data[0]应该有它里面的属性——命名相同,实际上,与cards.

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

4

2 回答 2

14

我已经解决了这个问题。基本上,所讨论that.data[0].cards的对象(a()我允许请求异步运行,使用计数器在success回调函数中确定是否a()应该调用。

运行后a(),函数b()应该对that.data[i].cards. 但是,由于对异步请求的依赖,在被调用b()之前正在运行。所以解决方案就是拨打电话。a()a()a()b()

所以这对我来说是一个非常简单的错误。令人困惑的是,登录that.data[0].cards到控制台向我显示该cards对象实际上已经构建,而实际上它还没有构建。所以控制台向我提供了不正确的——或者至少是不清楚的——信息。

谢谢大家昨晚的帮助!到处点赞:)

于 2011-10-28T12:58:15.150 回答
8

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

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:既然你不能这样做,我想出了另一种方法来查看是否有不可打印的字符:

像这样复制粘贴密钥字符串:(在两端尽可能多地移动,以便选择任何不可见的字符)

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

于 2011-10-27T21:00:34.097 回答