Почему это свойство объекта не определено?
Рассмотрим код ниже. Первый 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: так как вы не можете сделать это, я придумал другой способ проверить, есть ли непечатные символы:
Скопируйте строку ключа следующим образом: (сделайте все возможное для обоих концов, чтобы выбрать любые невидимые символы)
Затем выведите свой буфер обмена вот так (убедитесь, что вы используете двойные кавычки):