2009-03-15 20 views
16

Trong php, nếu bạn có đoạn mã sau:Thứ tự các trường trong đối tượng javascript có thể dự đoán được khi lặp qua chúng không?

$map = array(
    "first" => 1, 
    "second" => 2 
); 

$map["third"] = 3; 

foreach($map as $key => $value) { 
    // code 
} 

Bạn biết các mục sẽ được liệt kê theo thứ tự chúng đã được thêm vào mảng.

Bây giờ, tôi có thể giả định cùng một quy tắc áp dụng cho tương đương Javascript dưới đây không?

map = { 
    "first": 1, 
    "second": 2 
}; 

map["third"] = 3; 

for (key in map) { 
    // code 
} 

Đây là một bản sao của: Elements order - for (… in …) loop in javascript

+0

bản sao có thể có của [Thứ tự phần tử - cho (... trong ...) vòng lặp trong javascript] (http://stackoverflow.com/questions/280713/elements-order-for-in-loop-in-javascript) – Borgar

Trả lời

10

Hầu hết các trình duyệt sẽ lặp qua các thuộc tính theo thứ tự chúng được thêm vào đối tượng, nhưng tiêu chuẩn Javascript cho biết thứ tự là không xác định - vì vậy bạn không nên dựa vào hành vi này. Ví dụ: tôi đọc một số blog post một thời gian về cách Google Chrome không luôn thể hiện hành vi này.

Nếu bạn cần chức năng được sắp xếp, bạn nên tạo một lớp mới cho chính mình mà có thể sử dụng cả khóa đối tượng hoặc phím số.

+1

Cảm ơn rất nhiều về liên kết. Những gì John nói là, mặc dù nó không phải là tiêu chuẩn, các nhà cung cấp trình duyệt áp dụng nó như thể nó (vì vậy nhóm Chrome sẽ khắc phục lỗi ""). –

+1

Yup. Mặc dù tôi vẫn không nghĩ rằng bạn nên dựa vào hành vi. An toàn hơn để chỉ tạo một lớp tùy chỉnh, nơi bạn có thể tự xác định hành vi. –

0

Không, hành vi phụ thuộc vào việc thực hiện và nó không được đảm bảo. Sử dụng một mảng khi thứ tự cần được bảo tồn.

+1

Có nhưng (theo tiêu chuẩn): "Cơ chế liệt kê các thuộc tính (bước 5 trong thuật toán đầu tiên, bước 6 trong giây) phụ thuộc vào việc thực hiện. Thứ tự đếm được xác định bởi đối tượng." Vì vậy, điều tra chính nó phụ thuộc vào sự phụ thuộc, nhưng thứ tự phụ thuộc vào đối tượng, không? –

+1

@Julian: ấn bản tiếp theo 3.1 của ECMA-262 ít mơ hồ hơn: "Cơ chế và thứ tự liệt kê các thuộc tính [...] không được chỉ định." – Christoph

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