11

以下のコードを検討してください。1 つ目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

私は問題を解決しました。基本的に、問題のオブジェクト ( ) には、必要な XML ファイルに対するすべての AJAX 要求が処理された後に実行that.data[0].cardsされる関数によって作成されたプロパティがあります。コールバック関数でまだ呼び出す必要があるかどうかa()を判断するカウンターを使用して、リクエストを非同期で実行できるようにします。successa()

実行後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 に答える