2013-07-05 17 views
9

Tôi vừa cài đặt Aptana Studio cho sự phát triển và là một trong các lệnh có sẵn cho Javascript Chèn một vòng lặp for như thế này:Javascript cải thiện bản địa cho vòng lặp

for (var i=0; i < Things.length; i++) { 
    Things[i] 
}; 

lựa chọn khác là Insert cải thiện cho vòng lặp như thế này:

for (var i = Things.length - 1; i >= 0; i--){ 
    Things[i] 
}; 

Tại sao điều cuối cùng này tốt hơn phiên bản đầu tiên?

+7

Vì không yêu cầu truy cập thuộc tính độ dài mỗi lần. Trong phần sau, 'for' initialisation chỉ được thực hiện một lần. BTW, hầu hết mọi người vẫn thích cái đầu tiên để dễ đọc. –

+1

trùng lặp chính xác của [JavaScript - Các vòng lặp thực sự có đảo ngược nhanh hơn không ...?] (Http://stackoverflow.com/questions/1340589/javascript-are-loops-really-faster-in-reverse) Vui lòng tìm kiếm chính bạn ngay từ đầu - và câu hỏi đó là # 1 trong thanh bên "Liên quan" – Bergi

+0

@ cPu1 Hoặc đơn giản là vì họ không muốn lặp lại mảng của họ ngược ... – totymedli

Trả lời

11
// ( A ) (  B  ) (C) 
for (var i=0; i < Things.length; i++) { 
    Things[i] 
}; 
  • Một được thực hiện một lần trước khi vòng lặp khởi động.
  • B được đánh giá lại trước mỗi lần lặp, và nếu đó là không đúng sự thật, nó ra khỏi vòng lặp (do đó nó sẽ kiểm tra các thuộc tính length của Things trên mỗi iteration duy nhất.)
  • C được thực hiện sau mỗi lần lặp lại

Điều đó nói rằng, hiệu suất bạn nhận được từ việc thay đổi vòng lặp là tối thiểu, do đó bạn có thể đọc được những điều bạn thấy dễ đọc nhất. e-wise.


Điều này có thể có ý nghĩa hơn cho bạn:

for (var i=0; i < Things.length; i++) { 
    Things[i] = null; 
}; 

có thể được viết lại như sau:

var i = 0; //A 
while (true) { 
    if (!(i < Things.length)) { //B - We check the length all the time 
     break; 
    } 
    Things[i] = null; 
    i++; //C 
} 

for (var i = Things.length - 1; i >= 0; i--){ 
    Things[i] = null; 
}; 

có thể được viết lại như sau :

var i = Things.length - 1; //A - We only check the length once 
while (true) { 
    if (!(i >= 0)) { //B 
     break; 
    } 
    Things[i] = null; 
    i--; //C 
} 
+2

* 'while (true) {if (! X) break;…' * ??? Chỉ cần sử dụng 'while (X) {…' – Bergi

+0

@Bergi Đồng ý - và nó được nghĩ đến trong quá trình tạo mã ví dụ này, nhưng đây là phần giới thiệu về những gì xảy ra và cá nhân tôi tin rằng trong trường hợp chính xác này (cho để hiển thị nó bằng cách sử dụng điều kiện và câu lệnh 'break'. – h2ooooooo

+0

Tôi thích cách trình bày các cách khác nhau để viết cùng một vòng lặp :-) – Rikki

4

Do kết quả của Things.length không được đánh giá mỗi lần (trên mỗi lần lặp). Nó chỉ được gán một lần khi bắt đầu và được sử dụng từ thời điểm đó trở đi. Khác với số lần lặp lại rõ ràng là giống nhau.

Thực sự tối ưu hóa vi mô của nó. Bạn sẽ tìm thấy những điều thú vị hơn để tối ưu hóa trong mã của bạn tôi đoán.

+1

Câu trả lời này phải được chấp nhận! –

1

Tôi đoán rằng ở lần thứ hai bạn chỉ truy cập Things.length một lần (khi khởi tạo i) trong lần đầu tiên bạn truy cập vào nó mỗi lần để kiểm tra xem bạn có ở đó không.

4

Làm thế nào về điều đó?

for (var i = 0, len = things.length; i < len; i += 1) { 
    // something 
} 

Cập nhật:

Xin lỗi, tiếng Anh không phải là ngôn ngữ mẹ tôi. Vì vậy, tôi không có ý tưởng làm thế nào để bắt đầu cuộc trò chuyện với các bạn. Dù sao, đây là URL Youtube và tôi đã học được từ video đó. Tôi hy vọng điều này sẽ giúp bạn. Nó giải thích tại sao!

https://www.youtube.com/watch?v=mHtdZgou0qU

+1

Mặc dù câu trả lời của bạn có thể hữu ích, nhưng ít nhất bạn cũng nên giải thích tại sao. Vì vậy, câu trả lời của bạn đã được chuyển vào hàng kiểm duyệt Bài viết chất lượng thấp (đây là nơi tôi đang xem nó) Tôi đề nghị bạn chỉnh sửa câu trả lời của bạn để thêm giải thích. –

+0

@ChrisSpittles Ok, tôi đã cập nhật bài đăng. Cảm ơn bạn. –

+0

Hah, thú vị ... – Fahmi