max*_*son 11 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
Run Code Online (Sandbox Code Playgroud)
控制台中的结果:

知道这里发生了什么吗?该xml内部的财产that.data[0]也应该有它的内部性能-命名一样,其实,在属性cards.
FWIW,我在Firebug中得到了相同的东西(上面的控制台图像是Chrome).
max*_*son 13
我已经解决了这个问题.基本上,question(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对象已经被构建,而事实上它还没有.因此,控制台向我提供了不正确的 - 或至少不清楚 - 的信息.
谢谢大家昨晚的帮助!赞成四周:)
我认为对象键具有不可打印的字符,可以像这样复制:
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)] )
//[]
Run Code Online (Sandbox Code Playgroud)
编辑:您可以看到对象键是否属于这种情况:
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)
Run Code Online (Sandbox Code Playgroud)
编辑2:既然你不能这样做,我想出了另一种方法,看看是否有不可打印的字符:
像这样密钥键盘密封字符串:(尽可能在两端尽可能多地选择,以便选择任何不可见的字符)

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