2010-09-22 10 views
5

Tôi thường sử dụng mô hình này để lặp qua các thuộc tính đối tượng:Liệu có tiếp tục một mô hình tốt để tránh làm tổ quá mức trong khi lặp qua các thuộc tính trong Javascript không?

for(var property in object) { 
    if(object.hasOwnProperty(property)) { 
     ... 
    } 
} 

tôi không thích thụt đầu dòng quá mức này và gần đây nó đã được chỉ ra cho tôi rằng tôi có thể thoát khỏi nó bằng cách làm này:

for(var property in object) { 
    if(!object.hasOwnProperty(property)) { 
     continue; 
    } 

    ... 
} 

Tôi thích điều này bởi vì nó không đưa thêm mức thụt đầu dòng. Mẫu này có ổn không, hoặc có cách nào tốt hơn không?

Trả lời

5

Cá nhân tôi thích:

for(var property in object) if(object.hasOwnProperty(property)) { 
    ... 
} 

Không có cấp thêm thụt đầu dòng vì for, if, vv sẽ đưa câu lệnh tiếp theo nếu bạn bỏ qua các dấu ngoặc nhọn. Vì chúng ta đặt tất cả các mã của chúng ta bên trong khối if hasOwnProperty nó làm cho bất kỳ dấu ngoặc nào cho câu lệnh for không cần thiết.

Về cơ bản nó tương đương với:

for(var property in object) { 
    if(object.hasOwnProperty(property)) { 
    ... 
    } else { 
     continue; 
    } 
} 
+0

Cảm ơn - điều này chắc chắn sẽ giúp ích rất nhiều. Không biết rằng bạn có thể cấu trúc mã theo cách này! –

+0

+1, tôi thích điều này rất nhiều và tôi nghĩ rằng tôi sẽ bắt đầu sử dụng nó! (Nó cảm thấy một chút giống như sự hiểu biết danh sách của Python và máy phát điện, thực sự, mặc dù tôi đã không thực hiện bất kỳ chương trình nào trong ngôn ngữ đó) –

2

Syntacticly tôi muốn một cái gì đó như thế này

function own(obj) { 
    var ownprops = {}; 
    for (var prop in obj) 
    if (obj.hasOwnProperty(prop)) ownprops[prop] = 1; 

    return ownprops; 
} 

for (var property in own(object)) { 
//code 
} 

Trông đẹp, nhưng nó đòi hỏi hai vòng trên cùng một đối tượng, không khá hiệu suất khôn ngoan.

Một cách khác để làm điều đó là functionaly

function foreach(obj, func, thisp) { 
    for (var prop in obj) 
    if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop); 
} 

foreach(object, function(val, key) { 
    //code 
}); 

Chỉ có một vòng lặp, nhưng một hàm được gọi cho mỗi lần lặp, mà không phải là hiệu suất tuyệt vời khôn ngoan nhưng tốt hơn so với giải pháp cuối cùng. Lưu ý rằng nó cũng ghi đè giá trị của this, nhưng bạn có thể chuyển giá trị đó một cách rõ ràng làm đối số thứ 3 tùy chọn.

Chỉ một số lựa chọn thay thế. Cách bạn đang làm nó, và cách giải thích của Daniel là tốt, và không có sự thỏa hiệp hiệu suất.

Ngoài ra, tôi muốn chỉ ra rằng bạn không indent mã của bạn cho mỗi cú đúp xoăn đơn ...

+0

+1 for foreach. – Anurag

+0

Cảm ơn! Tôi thích chức năng 'foreach'! –

1

Một yếu tố phụ thuộc vào việc bạn lắng nghe Douglas Crockford. Trong cuốn sách của mình, JavaScript: The Good Parts, anh ta bị ố continue với các chi tiết xấu.

"Tôi chưa bao giờ thấy một đoạn mã không được cải thiện bằng cách tái cấu trúc mã để xóa câu lệnh tiếp tục". - Douglas Crockford, JavaScript: Các bộ phận tốt

Như được đề cập trong bình luận của mình, Crockford không đưa ra lý do gì trong cuốn sách giải thích tại sao continue nên tránh. Nhưng trên his website, ông nói, "Nó có xu hướng che khuất luồng điều khiển của hàm." Tôi chỉ đề cập đến quan điểm của Crockford vì nhiều người cho rằng anh ta là một người có thẩm quyền.

Cá nhân tôi không thấy bất kỳ vấn đề nào với cách bạn mã hóa vòng lặp của mình, đặc biệt là vì số continue xuất hiện ngay trên đầu, nơi không dễ bị bỏ qua. Bạn có đang làm việc với một nhóm các nhà phát triển không?Họ có hiểu biết tốt về những gì continue không? Bạn có một quy ước mã tài liệu mà nói về cách xử lý sâu làm tổ của báo cáo?

+1

Đó là một khẳng định có nghĩa là không có gì mà không có bất kỳ lý do để sao lưu nó lên. –

+1

Bạn nói đúng, và thiếu một lý do nghi ngờ trong cuốn sách. Trên trang web của mình, anh ta chỉ nói câu lệnh tiếp tục "có xu hướng che khuất luồng điều khiển của hàm." Tuy nhiên, tôi nghĩ nó đáng nói đến vì nhiều nhà phát triển dường như có những lời của Douglas Crockford như Lời Chúa khi nói đến JavaScript. – stevelove

+0

Có, tôi đã nhìn thấy 'tiếp tục 'cùng với' break'. Tôi hiếm khi sử dụng 'break' nhưng tôi thấy rằng trong một số trường hợp, nó thực sự cải thiện khả năng đọc. –

0

McConnel:

Một vòng lặp với nhiều vi phạm có thể chỉ ra suy nghĩ rõ ràng về cấu trúc của vòng lặp hoặc vai trò của nó trong mã xung quanh. Ngắt quá mức tăng thường chỉ ra rằng vòng lặp có thể được thể hiện rõ ràng hơn dưới dạng chuỗi vòng lặp . Sử dụng break loại bỏ khả năng xử lý một vòng lặp như một hộp đen. Kiểm soát điều kiện thoát của vòng lặp với một tuyên bố để đơn giản hóa vòng lặp của bạn. 'ngắt' buộc người đọc mã số của bạn để nhìn vào bên trong để hiểu điều khiển vòng lặp của , làm cho vòng lặp thêm khó hiểu.

Dijkstra:

các tính năng như phá vỡ xu hướng phá hoại những lợi ích của cấu trúc lập trình, và ngăn ngừa các lập trình viên từ sự hiểu biết chương trình như một thành phần của đơn vị độc lập

Vòng lặp với tiếp tục có thể được tính vào biểu mẫu này và do đó vòng lặp có thể được coi là hộp đen. Crawford là sai. Breaks mùi, nhưng tiếp tục là tốt.

phân tích sâu hơn: http://sites.google.com/site/dustingetz/dev/break-and-continue

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