请考虑以下代码。第一个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)。
答案 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:由于你不能这样做,我想出了另一种方法,看看是否有不可打印的字符:
像这样密码密钥字符串:(在两端尽可能多地使用,以便选择任何不可见的字符)
然后像这样转储你的剪贴板(确保使用双引号):