Câu trả lời thực sự cho điều này trong trường hợp của bất kỳ động cơ cụ thể nào sẽ phụ thuộc vào việc thực hiện của động cơ đó. (Như kích thước của sự khác biệt, nếu có.)
Tuy nhiên, có những bất biến. Ví dụ, hãy xem xét:
var obj = {a: "alpha", b: "beta"};
var name;
for (name in obj) {
console.log(obj[name]);
}
var arr = ["alpha", "beta"];
var index;
for (index = 0; index < arr.length; ++index) {
console.log(arr[index]);
}
Trong trường hợp của obj
, động cơ có sử dụng một cơ chế để theo dõi trong đó thuộc tính bạn đã lặp lại và những người thân mà bạn chưa, cũng như lọc ra các thuộc tính không thể đếm được. Ví dụ: có một số loại đối tượng trình lặp đằng sau hậu trường (và cách xác định thông số, đó có thể là một mảng tạm thời).
Trong trường hợp arr
, nó không; bạn đang xử lý điều đó trong mã của mình, theo cách rất đơn giản, hiệu quả.
Nội dung của khối của mỗi vòng lặp giống nhau: Tra cứu tài sản trên một đối tượng. (Trong trường hợp thứ hai, về mặt lý thuyết, cũng có chuyển đổi số thành chuỗi.)
Vì vậy, tôi hy vọng câu trả lời không thực hiện duy nhất cho điều này là: Chi phí bổ sung.
Nguồn
2012-11-21 08:07:36
Vâng, tôi đoán rằng nhận được tất cả các phím là một quá trình tương đối chậm so với ... không nhận được chúng;) 'for ... in' phải tra cứu các phím đầu tiên trong khi với một' for' bình thường vòng lặp, bạn đang cung cấp khóa thông qua biến vòng lặp. –
Đây là một thử nghiệm JSPerf cho thấy chạy 'for ... in' gần như giống với' Object.keys() '(ít nhất là trong Chrome): http://jsperf.com/for-in- vs-keys-vs-for.Vì vậy, nhận được các phím và/hoặc tất cả mọi thứ liên quan đến điều này là chậm hơn và cung cấp các phím từ bên ngoài. Nhưng nó cũng phụ thuộc vào việc thực hiện, giống như T.J. nói. –