Perf cũng là một lý do. Đôi khi bạn có thể cần phải lặp qua các phím. có nhiều hướng khác nhau để làm điều đó
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
Tôi thường sử dụng for of Object.keys()
vì nó làm đúng và tương đối ngắn gọn, không cần thêm kiểm tra.
Nhưng, nó chậm hơn nhiều .
Chỉ cần đoán lý do Object.keys
là chậm là rõ ràng, Object.keys()
phải phân bổ. Trong thực tế AFAIK, nó phải phân bổ một bản sao của tất cả các khóa kể từ đó.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
Có thể công cụ JS có thể sử dụng một số loại cấu trúc khóa bất biến để Object.keys(object)
trả về một tham chiếu thứ gì đó lặp lại trên các khóa bất biến và object.newProp
tạo ra một đối tượng khóa bất biến hoàn toàn mới nhưng dù sao, nó rõ ràng chậm hơn tới 15 lần
Ngay cả việc kiểm tra hasOwnProperty
cũng chậm hơn tới 2 lần.
Điểm quan trọng của tất cả đó là nếu bạn có mã nhạy cảm hoàn hảo và cần lặp lại các khóa thì bạn muốn có thể sử dụng for in
mà không phải gọi hasOwnProperty
. Bạn chỉ có thể làm điều này nếu bạn chưa sửa đổiObject.prototype
lưu ý rằng nếu bạn sử dụng Object.defineProperty
để sửa đổi nguyên mẫu nếu những thứ bạn thêm vào không thể đếm được thì chúng sẽ không ảnh hưởng đến hành vi của JavaScript trong các trường hợp trên. Thật không may, ít nhất là trong Chrome 83, chúng ảnh hưởng đến hiệu suất.
Tôi đã thêm 3000 thuộc tính không thể đếm được chỉ để cố gắng buộc bất kỳ vấn đề hoàn hảo nào xuất hiện. Chỉ với 30 thuộc tính, các thử nghiệm đã quá gần để biết liệu có bất kỳ tác động hoàn hảo nào hay không.
https://jsperf.com/does-adding-non-enumerable-properies-affect-perf
Firefox 77 và Safari 13.1 cho thấy không có sự khác biệt về sự hoàn hảo giữa các lớp Augmented và Unaugished có thể v8 sẽ được sửa trong lĩnh vực này và bạn có thể bỏ qua các vấn đề hoàn hảo.
Nhưng, hãy để tôi cũng thêm đó là câu chuyện củaArray.prototype.smoosh
. Phiên bản ngắn là Mootools, một thư viện phổ biến, được tạo riêng Array.prototype.flatten
. Khi ủy ban tiêu chuẩn cố gắng thêm một người bản địa, Array.prototype.flatten
họ đã tìm thấy không thể phá vỡ nhiều trang web. Các nhà phát triển đã phát hiện ra việc phá vỡ đề nghị đặt tên phương thức es5 smoosh
là một trò đùa nhưng mọi người hoảng hốt không hiểu đó là một trò đùa. Họ giải quyết flat
thay vìflatten
Đạo đức của câu chuyện là bạn không nên mở rộng các đối tượng bản địa. Nếu bạn làm như vậy, bạn có thể gặp phải vấn đề tương tự về việc phá vỡ nội dung của mình và trừ khi thư viện cụ thể của bạn trở nên phổ biến như MooTools, các nhà cung cấp trình duyệt không có khả năng giải quyết vấn đề bạn gây ra. Nếu thư viện của bạn trở nên phổ biến, đó sẽ là một ý nghĩa để buộc mọi người khác giải quyết vấn đề bạn gây ra. Vì vậy, xin vui lòng không mở rộng đối tượng bản địa