Почему это свойство объекта не определено?

Рассмотрим код ниже. Первый 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).

2 ответа

Решение

Я решил проблему. В основном объект, о котором идет речь (that.data[0].cards) имеет свои свойства, созданные функцией a() он запускается после обработки всех запросов AJAX на необходимые файлы XML. Я позволяю запросам выполняться асинхронно, используя счетчик для определения в 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)] )

//[]

Изменить: вы можете увидеть, если это так для ваших ключей объекта:

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: так как вы не можете сделать это, я придумал другой способ проверить, есть ли непечатные символы:

Скопируйте строку ключа следующим образом: (сделайте все возможное для обоих концов, чтобы выбрать любые невидимые символы)

Затем выведите свой буфер обмена вот так (убедитесь, что вы используете двойные кавычки):

Другие вопросы по тегам