2012-02-01 23 views
6

Sự khác biệt giữa mã (i) và (ii) được viết dưới đây là gì?Sử dụng. hoặc [] để truy cập các thuộc tính của đối tượng - sự khác biệt là gì?

(i)

var obj:Object = new Object(); 
obj.attribute = value ; 

(ii)

var obj:Object = new Object(); 
obj["key"] = value; 

Có bất kỳ ý nghĩa thời gian chạy nếu tôi viết những dòng này:

var obj:Object = new Object(); 
obj.somekey = value1 ; 
obj["someKey"] = value2 ; 

Xin giải thích.

Trả lời

21

Sự khác biệt là trong cơ chế tra cứu: Nếu bạn sử dụng cú pháp chấm, trình biên dịch sẽ biết tại thời gian biên dịch mà bạn đang truy cập thuộc tính của đối tượng đó. Nếu bạn sử dụng cú pháp khung, tra cứu thực tế của thuộc tính được thực hiện trong thời gian chạy và sẽ phải kiểm tra kiểu hơn - sau khi tất cả, bạn có thể soạn chuỗi khóa động, giá trị có thể thay đổi hoặc thậm chí bạn có thể gọi một hàm thay vì một biến, v.v.

Kết quả là sự khác biệt đáng kể về hiệu suất: Cú pháp khung mất khoảng ba lần để thực thi cú pháp dấu chấm.

Dưới đây là một thử nghiệm tốc độ nhỏ để minh họa cho quan điểm của tôi:

var start : int = getTimer(); 

var obj:Object = { something : "something" }; 

for (var i : int = 0; i < 100000000; i++) { 
    var n:String = obj.something; 
} 

trace ("Time with dot syntax: "+(getTimer() - start)); 

start = getTimer(); 

for (i = 0; i < 100000000; i++) { 
    var o:String = obj["something"]; 
} 

trace ("Time with bracket syntax: "+(getTimer() - start)); 

Nếu hai là như nhau, trừ trường hợp ký hiệu, họ nên chính xác cùng một lượng thời gian. Nhưng như bạn có thể thấy, đây không phải là trường hợp. Trên máy của tôi:

Time with dot syntax:  3937 
Time with bracket syntax: 9857 
+0

cảm ơn, bìa đẹp –

+2

Điểm thưởng cho điểm chuẩn! –

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