2013-02-18 24 views
29

ECMAScript 5 của array.forEach(callback[, thisArg]) rất thuận tiện để lặp trên một mảng và có nhiều lợi thế hơn các cú pháp với một cho:Tại sao không có phương pháp forEach trên Object trong ECMAScript 5?

  • Đó là ngắn gọn hơn.
  • Nó không tạo ra các biến mà chúng ta chỉ cần cho mục đích lặp lại.
  • Nó tạo phạm vi hiển thị cho các biến cục bộ của vòng lặp.
  • Nó tăng hiệu suất.

Có lý do tại sao không có object.forEach để thay thế for(var key in object)?

Tất nhiên, chúng tôi có thể sử dụng triển khai JavaScript, như _.each hoặc $ .each nhưng đó là những người giết hiệu suất.

+1

Đây là câu hỏi phù hợp hơn với những người tham gia vào các cuộc thảo luận của ES5/ES6. – alex

+0

Tại sao 'for-in' cần thay thế? Và tại sao một 'Object.forEach' cũng không phải là một kẻ giết người hiệu suất? Cú đánh chủ yếu đến từ việc gọi hàm gọi lại. –

Trả lời

62

Vâng, nó khá dễ dàng để tự nâng cấp. Tại sao tiếp tục gây ô nhiễm các nguyên mẫu?

Object.keys(obj).forEach(function(key) { 
    var value = obj[key]; 
}); 

Tôi nghĩ một lý do lớn là các quyền hạn muốn tránh thêm các thuộc tính dựng sẵn vào Object. Object s là các khối xây dựng của mọi thứ trong Javascript, nhưng cũng là khóa chung/giá trị chung trong ngôn ngữ. Việc thêm thuộc tính mới vào Object sẽ xung đột với tên thuộc tính mà chương trình Javascript của bạn có thể muốn sử dụng. Vì vậy, việc thêm tên được xây dựng vào Object được thực hiện hết sức thận trọng.

Mảng được lập chỉ mục theo số nguyên, do đó, nó không có vấn đề này.

Đây cũng là lý do tại sao chúng tôi có Object.keys(obj) thay vì chỉ đơn giản là obj.keys. Làm ô nhiễm các nhà xây dựng Object vì nó thường không phải là một việc lớn, nhưng để lại trường hợp một mình.

+18

Nhưng có 'Object.forEach' (không có trong nguyên mẫu) sẽ được tốt đẹp. – kirilloid

+5

Nó sẽ, tôi đồng ý :) –

+1

IMHO không được điều chỉnh. Nó được gọi là sự nhất quán. Các ngôn ngữ khác có nó, JS là một trong những điều tồi tệ nhất trên bảng đó. Các hành động và biến đổi Simmilar được thực hiện trên các loại khác nhau của các loại làm việc một cách hợp lý khác nhau và có cú pháp hoàn toàn khác. Một trong những cú sốc lớn nhất bạn phải ăn nếu bạn được tổ chức trong đầu, JS sẽ vít bạn hơn – DanteTheSmith

2

Bạn phải nhớ rằng mọi đối tượng trong javascript được kế thừa từ Object. Không phải mọi đối tượng trong javascript cần phải có thuộc tính của nó được lặp lại. Những người này chủ yếu được giới hạn trong các đối tượng mô hình dữ liệu. Việc thêm phương thức forEach sẽ chỉ tăng số lượng nguyên mẫu mỗi đối tượng không cần thiết.

Nếu bạn hiện đang nhìn thấy đối tượng và phương pháp của nó, chúng chỉ có mặt để xác định đối tượng hoặc để phân biệt một đối tượng với đối tượng khác.

5
  1. .forEachkhông tạo ra các biến chỉ với mục đích lặp ... Chỉ cần không những bạn tạo ra, chính mình.
    Nếu bạn đang sử dụng một shim, sau đó họ đang JS biến trong một đóng cửa, khác họ có khả năng trong C + +, hoặc bất cứ điều gì thực hiện bản địa của trình duyệt được.

  2. ES6 đang nhận for ... of sẽ lặp qua bất kỳ nội dung nào bạn vượt qua.

  3. ES6 cũng là nhận được biến khối cấp (chứ không phải là chức năng đặt phạm vi), sử dụng let, thay vì var

  4. Bạn sẽ có thể thêm vòng lặp để loại cụ thể của các đối tượng trong ES6 (ví dụ: các các đối tượng bạn xây dựng để hỗ trợ trình vòng lặp).

Nhưng vấn đề ở đây là ES5 có nghĩa là bảo toàn hầu hết cú pháp của ES3 (vài từ khóa mới và không có từ khóa mới nào được sử dụng thường xuyên).
Hầu hết các chức năng bổ sung phải là cuộc gọi phương thức (được tạo mẫu, thường).
Và các mảng cần rất nhiều công việc, cho biết sử dụng JS nhiều hơn kể từ khi ES3 ra mắt.

Đối tượng không cần khả năng .map()/.reduce(), trừ khi bạn đang xây dựng các đối tượng RẤT CỤ THỂ, trong trường hợp đó, bạn đang tự mình triển khai.

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