2011-10-27 44 views
10

Hãy xem xét mã bên dưới. console.log đầu tiên ghi lại hình ảnh một cách chính xác và bạn có thể xem các thuộc tính của nó trong hình ảnh bên dưới. Tuy nhiên, khi tôi thử đăng nhập một tài sản của nó vào giao diện điều khiển, tôi nhận được undefined!Tại sao thuộc tính đối tượng này không xác định?

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 

Kết quả trong giao diện điều khiển:

enter image description here

Bất kỳ ý tưởng những gì đang xảy ra ở đây? Thuộc tính xml bên trong số that.data[0] cũng phải có các thuộc tính bên trong nó - được đặt tên giống nhau, trên thực tế, như các thuộc tính trong cards.

FWIW, tôi nhận được điều tương tự trong Firebug (hình ảnh trên bảng điều khiển ở trên là Chrome).

+1

Không thể giúp bạn nếu chúng ta không thể tái tạo hành vi. Bạn có thể cung cấp JSON không? –

+2

Bạn có thể chuyển kết quả của JSON.stringify (đó) không? – FreeCandies

+0

'JSON.stringify (that)' dường như không làm gì ngoại trừ việc mang tập lệnh đến một điểm dừng hoàn toàn.Không ném một lỗi hoặc bất kỳ lỗi nào khác, nhưng không có gì chạy sau cuộc gọi đến 'JSON.stringify (đó)'. Tôi đã cập nhật câu hỏi của mình để hiển thị các kết quả của 'JSON.stringify (that.data [0] .cards)', nó chỉ cho thấy nó là một đối tượng trống '{}'. – maxedison

Trả lời

11

tôi đã giải quyết được vấn đề. Về cơ bản, đối tượng được đề cập (that.data[0].cards) có các thuộc tính được tạo bởi hàm a() chạy sau khi tất cả các yêu cầu AJAX cho các tệp XML cần thiết đã được xử lý. Tôi cho phép các yêu cầu chạy không đồng bộ, sử dụng bộ đếm để xác định chức năng gọi lại success nếu a() phải được gọi.

Sau khi a() chạy, chức năng b() được cho là hoạt động trên that.data[i].cards. Tuy nhiên, b() đã chạy trước a() được gọi vì sự phụ thuộc vào các yêu cầu không đồng bộ của a(). Vì vậy, giải pháp chỉ đơn giản là thực hiện a() gọi b().

Vì vậy, điều này hóa ra lại là một sai lầm khá đơn giản về phía tôi. Điều làm cho nó trở nên khó hiểu là thực tế rằng việc ghi nhật ký that.data[0].cards vào bàn điều khiển cho thấy rằng trên thực tế đối tượng cards đã được xây dựng, trong khi thực tế nó chưa có. Vì vậy, giao diện điều khiển đã cung cấp cho tôi không chính xác - hoặc ít nhất là không rõ ràng - thông tin.

Cảm ơn sự giúp đỡ của mọi người tối qua! Upvotes tất cả các xung quanh :)

+0

một bí ẩn khác được giải quyết :) – Esailija

+0

Tôi tình cờ gặp vấn đề tương tự ngày hôm nay. Cảm ơn. –

7

Tôi nghĩ rằng các phím đối tượng có nhân vật chưa in ra, chẳng hạn có thể được nhân rộng như thế này:

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)]) 

//[] 

Edit: bạn có thể xem đây là trường hợp cho các phím đối tượng của bạn:

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 : Vì bạn không thể làm điều đó, tôi đã nghĩ ra một cách khác để xem liệu có các ký tự không thể in được không:

Sao chép chuỗi khóa như sau: (đi hết mức có thể trên bo mạch thứ kết thúc, do đó bạn chọn bất kỳ nhân vật vô hình)

Sau đó đổ vào clipboard của bạn như thế này (Hãy chắc chắn rằng bạn đang sử dụng dấu ngoặc kép):

+0

Dường như sản xuất cùng một kết quả. Tôi đã làm: 'console.log (that.data [0] .cards ['E' + String.fromCharCode (15)]);' – maxedison

+0

Đó là vì đối tượng của bạn có thể có ký tự ẩn khác với 'String.fromCharCode (15)' , nó có thể là 3, 24 hoặc 22 và vân vân :) – Esailija

+0

@macedison: Và vì lý do @ Esailija, hãy sao chép/dán kết quả chính xác của 'JSON.stringify (that.data [0])' để nó có thể đã nghiên cứu – pimvdb

Các vấn đề liên quan