Sự khác biệt cơ bản nhất giữa for
vòng lặp và forEach
phương pháp là, với phương pháp trước đây, bạn có thể break
thoát khỏi vòng lặp. Bạn có thể mô phỏng continue
bằng cách đơn giản quay lại từ hàm được truyền tới forEach
, nhưng không có cách nào để dừng lặp lại hoàn toàn.
Ngoài ra, cả hai đều thực hiện hiệu quả cùng một chức năng. Một sự khác biệt nhỏ khác liên quan đến phạm vi của chỉ mục (và tất cả các biến chứa các biến) trong vòng lặp for, do biến lưu trữ.
// 'i' is scoped to the containing function
for (var i = 0; i < arr.length; i++) { ... }
// 'i' is scoped to the internal function
arr.forEach(function (el, i) { ... });
Tuy nhiên, tôi thấy điều đó forEach
biểu cảm hơn nhiều — nó thể hiện ý định của bạn để lặp lại qua từng phần tử của một mảng và nó cung cấp cho bạn một tham chiếu đến phần tử, không chỉ chỉ mục. Nhìn chung, nó chủ yếu phụ thuộc vào sở thích cá nhân, nhưng nếu bạn có thể sử dụng forEach
, tôi khuyên bạn nên sử dụng nó.
Có một vài khác biệt đáng kể giữa hai phiên bản, đặc biệt là về hiệu suất. Trên thực tế, vòng lặp for đơn giản hoạt động tốt hơn đáng kể so với forEach
phương pháp này, như được chứng minh bằng phép thử jsperf này .
Hiệu suất như vậy có cần thiết cho bạn hay không là do bạn quyết định, và trong hầu hết các trường hợp, tôi sẽ ưu tiên sự biểu cảm hơn tốc độ. Sự khác biệt về tốc độ này có thể là do sự khác biệt nhỏ về ngữ nghĩa giữa vòng lặp cơ bản và phương thức khi hoạt động trên các mảng thưa thớt, như đã nêu trong câu trả lời này .
Nếu bạn không cần hành vi của forEach
và / hoặc bạn cần thoát ra khỏi vòng lặp sớm, bạn có thể sử dụng Lo-Dash's _.each
để thay thế, cũng sẽ hoạt động trên nhiều trình duyệt. Nếu bạn đang sử dụng jQuery, nó cũng cung cấp một hàm tương tự $.each
, chỉ cần lưu ý sự khác biệt về các đối số được truyền cho hàm gọi lại trong mỗi biến thể.
(Đối với forEach
polyfill, nó sẽ hoạt động trong các trình duyệt cũ hơn mà không gặp sự cố, nếu bạn chọn đi theo con đường đó.)
break
thoát raforEach
. Nhưng một lợi thế lớn là tạo một phạm vi mới với chức năng. Với polyfill, bạn sẽ không gặp bất kỳ vấn đề nào (ít nhất là tôi chưa gặp phải bất kỳ vấn đề nào).