2015-05-19 23 views
7
// hasOwnProperty approach 
for (key in obj) { 
    if (obj.hasOwnProperty(key)) { 
    value = obj[key]; 
    } 
} 

// Object.keys approach 
keys = Object.keys(obj); 
for (i = 0, l = keys.length; i < l; i++) { 
    value = obj[keys[i]]; 
} 

Theo jsperf cách tiếp cận Object.keys nhanh http://jsperf.com/object-keys-vs-hasownproperty/45Tại sao Object.keys nhanh hơn hasOwnProperty?

Tại sao điều này 50% +?

+0

Thử nghiệm của bạn có thể không phải là những gì bạn mong đợi, một tối ưu hóa đơn giản sẽ làm: 'keys = Object.keys (obj); value = obj [keys [keys.length - 1]]; 'bỏ qua vòng lặp của bạn. Trong thử nghiệm đầu tiên, nó thực hiện kiểm tra trên mỗi vòng lặp, vì lần thứ hai chỉ điền một biến với giá trị – Hacketo

+0

Rõ ràng là 'for in' cần phải thực hiện nhiều hơn' Object.keys' và lọc bổ sung cho 'hasOwnProperty 'thậm chí còn hiệu quả hơn. – Bergi

+1

Có lẽ vì 'Object.keys' chỉ được gọi một lần trong khi' hasOwnProperty' được gọi nhiều lần (một lần cho mỗi thuộc tính enumerable và một lần cho mỗi thuộc tính không thể đếm được). Các cuộc gọi hàm khác có nghĩa là mã chậm hơn. Ngoài ra, 'Object.keys' là một hàm gốc. Do đó, trong tất cả các xác suất nó nhanh hơn một shim JavaScript cho cùng một. –

Trả lời

34
  • Object.keys nhìn lên tất cả riêng, đếm tài sản (oh, và mảng là nhanh).
  • for in thêm ngước lên thừa hưởng đếm tài sản, không chỉ những cái riêng của
  • for in + hasOwnProperty kiểm tra bổ sung tất cả nhìn lên thuộc tính cho dù họ là tài sản riêng.

Ngay cả khi không có thuộc tính đếm được kế thừa, vẫn còn nhiều việc phải làm hơn là không.

+2

Câu trả lời của bạn được sạch sẽ và dễ hiểu. –

1

Hầu hết các thử nghiệm trong chuỗi đó hiển thị hasownproperty để nhanh hơn Object.keys(). Tuy nhiên, đối với những thử nghiệm đó, số lượng tài sản để chu kỳ là nhỏ (< 20 thuộc tính).

Bất kỳ nơi nào thuộc tính đối tượng lớn (không có số chính xác, kiểm tra với> 100 phím cho thấy Object.keys() là người chiến thắng rõ ràng), Object.keys() đánh bại nó.

Xem https://jsperf.com/object-keys-vs-hasownproperty/55. Bạn có thể đi đến cuối trang để xem tất cả các sửa đổi để thử nghiệm.

+0

Tôi không biết thỏa thuận là gì, nhưng bắt đầu với bản sửa đổi 47, nó cho thấy rằng 'hasOwnProperty' là nhanh nhất. 9.809.798 so với 3.712.304. – blissfool

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