cho
for
vòng lặp hiệu quả hơn nhiều. Nó là một cấu trúc lặp được thiết kế đặc biệt để lặp lại trong khi một điều kiện là đúng , đồng thời cung cấp một cơ chế bước (nói chung là để tăng trình lặp). Thí dụ:
for (var i=0, n=arr.length; i < n; ++i ) {
...
}
Điều này không có nghĩa là for -loops sẽ luôn hiệu quả hơn, chỉ là các công cụ JS và trình duyệt đã tối ưu hóa chúng để trở nên như vậy. Trong những năm qua, đã có những thỏa hiệp về việc cấu trúc lặp nào hiệu quả hơn (cho, trong khi, giảm, đảo ngược trong khi, v.v.) - các trình duyệt và công cụ JS khác nhau có các triển khai riêng cung cấp các phương pháp khác nhau để tạo ra kết quả giống nhau. Khi các trình duyệt tối ưu hóa hơn nữa để đáp ứng nhu cầu hiệu suất, về mặt lý thuyết [].forEach
có thể được triển khai theo cách nhanh hơn hoặc có thể so sánh với a for
.
Những lợi ích:
- Có hiệu quả
- chấm dứt sớm vòng lặp (danh hiệu
break
và continue
)
- điều khiển điều kiện (
i<n
có thể là bất kỳ thứ gì và không bị ràng buộc với kích thước của một mảng)
- biến Phạm vi (
var i
lá i
có sẵn sau khi vòng lặp kết thúc)
cho mỗi
.forEach
là các phương thức chủ yếu lặp qua các mảng (cũng trên các kiểu liệt kê khác, chẳng hạn như Map
và Set
đối tượng). Chúng mới hơn và cung cấp mã dễ đọc hơn về mặt chủ quan. Thí dụ:
[].forEach((val, index)=>{
...
});
Những lợi ích:
- không liên quan đến thiết lập biến (lặp qua từng phần tử của mảng)
- functions / arrow-functions phạm vi biến tới khối
Trong ví dụ trên, val
sẽ là một tham số của hàm mới được tạo. Do đó, bất kỳ biến nào được gọi val
trước vòng lặp, sẽ giữ giá trị của chúng sau khi nó kết thúc.
- về mặt chủ quan dễ bảo trì hơn vì có thể dễ dàng hơn để xác định mã đang làm gì - nó lặp lại trên một liệt kê; trong khi vòng lặp for có thể được sử dụng cho bất kỳ số lượng sơ đồ lặp nào
Hiệu suất
Hiệu suất là một chủ đề phức tạp, thường đòi hỏi một số kinh nghiệm khi suy nghĩ trước hoặc tiếp cận. Để xác định trước (trong khi phát triển) mức độ tối ưu hóa có thể được yêu cầu, một lập trình viên phải có một ý tưởng tốt về kinh nghiệm trong quá khứ với trường hợp vấn đề, cũng như hiểu rõ về các giải pháp tiềm năng.
Việc sử dụng jQuery trong một số trường hợp đôi khi có thể quá chậm (một nhà phát triển có kinh nghiệm có thể biết điều đó), trong khi những trường hợp khác có thể không phải là vấn đề, trong trường hợp này, thư viện tuân thủ nhiều trình duyệt và dễ dàng thực hiện các chức năng khác (ví dụ: AJAX, xử lý sự kiện) sẽ đáng để tiết kiệm thời gian phát triển (và bảo trì).
Một ví dụ khác là, nếu hiệu suất và tối ưu hóa là tất cả mọi thứ, sẽ không có mã nào khác ngoài máy hoặc lắp ráp. Rõ ràng là không phải như vậy vì có nhiều ngôn ngữ cấp cao và cấp thấp khác nhau, mỗi ngôn ngữ đều có sự cân bằng của riêng chúng. Những sự cân bằng này bao gồm, nhưng không giới hạn ở sự chuyên môn hóa, tính dễ dàng và tốc độ phát triển, sự dễ dàng và tốc độ bảo trì, mã được tối ưu hóa, mã không có lỗi, v.v.
Tiếp cận
Nếu bạn không hiểu rõ liệu thứ gì đó sẽ yêu cầu mã được tối ưu hóa, thì thông thường, trước tiên bạn nên viết mã có thể bảo trì được. Từ đó, bạn có thể kiểm tra và xác định những gì cần chú ý hơn khi nó được yêu cầu.
Điều đó nói rằng, một số tối ưu hóa rõ ràng nhất định nên là một phần của thực tiễn chung và không cần phải suy nghĩ. Ví dụ, hãy xem xét vòng lặp sau:
for (var i=0; i < arr.length; ++i ){}
Đối với mỗi lần lặp lại của vòng lặp, JavaScript đang truy xuất arr.length
, một thao tác tính phí tra cứu khóa trên mỗi chu kỳ. Không có lý do gì khiến điều này không nên xảy ra:
for (var i=0, n=arr.length; i < n; ++i){}
Điều này thực hiện tương tự, nhưng chỉ truy xuất arr.length
một lần, lưu vào bộ nhớ đệm của biến và tối ưu hóa mã của bạn.