Việc triển khai Đối tượng tiêu chuẩn ( Các thuộc tính và phương thức bên trong đối tượng ES5.1 ) không yêu cầu Object
phải theo dõi số lượng khóa / thuộc tính của nó, do đó, không có cách tiêu chuẩn nào để xác định kích thước của một khóa Object
mà không lặp lại một cách rõ ràng hoặc ngầm định trên các khóa của nó.
Vì vậy, đây là những lựa chọn thay thế được sử dụng phổ biến nhất:
1. Object.keys của ECMAScript ()
Object.keys(obj).length;
Hoạt động bằng cách lặp bên trong các phím để tính toán một mảng tạm thời và trả về độ dài của nó.
- Ưu điểm - Cú pháp dễ đọc và rõ ràng. Không yêu cầu thư viện hoặc mã tùy chỉnh ngoại trừ shim nếu không có hỗ trợ riêng
- Nhược điểm - Chi phí bộ nhớ do tạo ra mảng.
2. Giải pháp dựa trên thư viện
Nhiều ví dụ dựa trên thư viện ở những nơi khác trong chủ đề này là những thành ngữ hữu ích trong ngữ cảnh thư viện của họ. Tuy nhiên, từ quan điểm hiệu năng, không có gì để đạt được so với mã không có thư viện hoàn hảo vì tất cả các phương thức thư viện đó thực sự gói gọn một vòng lặp for hoặc ES5 Object.keys
(gốc hoặc shimmed).
3. Tối ưu hóa một vòng lặp for
Phần chậm nhất của vòng lặp for như vậy thường là .hasOwnProperty()
cuộc gọi, vì chức năng gọi qua chức năng. Vì vậy, khi tôi chỉ muốn số lượng mục nhập của một đối tượng JSON, tôi chỉ bỏ qua .hasOwnProperty()
cuộc gọi nếu tôi biết rằng không có mã nào được thực hiện cũng sẽ không mở rộng Object.prototype
.
Mặt khác, mã của bạn có thể được tối ưu hóa một chút bằng cách tạo k
local ( var k
) và bằng cách sử dụng toán tử tăng tiền tố ( ++count
) thay vì postfix.
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
Một ý tưởng khác dựa vào bộ nhớ đệm hasOwnProperty
phương thức:
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
Điều này có nhanh hơn hay không trên một môi trường nhất định là một câu hỏi về điểm chuẩn. Hiệu suất rất hạn chế có thể được dự kiến dù sao.