i) sự khác biệt giữa hai đối tượng này là gì
Câu trả lời đơn giản là [object]
chỉ ra một đối tượng máy chủ không có lớp bên trong. Đối tượng máy chủ lưu trữ là một đối tượng không phải là một phần của triển khai ECMAScript mà bạn đang làm việc, nhưng được máy chủ cung cấp dưới dạng một phần mở rộng. DOM là một ví dụ phổ biến của các đối tượng máy chủ, mặc dù trong hầu hết các triển khai mới hơn, các đối tượng DOM kế thừa từ Đối tượng gốc và có tên lớp bên trong (chẳng hạn như HTMLElement , Window , v.v.). ActiveXObject độc quyền của IE là một ví dụ khác về đối tượng máy chủ.
[object]
thường thấy nhất khi cảnh báo các đối tượng DOM trong Internet Explorer 7 trở xuống, vì chúng là các đối tượng máy chủ lưu trữ không có tên lớp bên trong.
ii) loại Đối tượng này là gì
Bạn có thể lấy "loại" (lớp bên trong) của đối tượng bằng cách sử dụng Object.prototype.toString
. Đặc tả yêu cầu nó luôn trả về một chuỗi theo định dạng [object [[Class]]]
, ở đó [[Class]]
là tên lớp bên trong như Đối tượng , Mảng , Ngày , RegExp , v.v. Bạn có thể áp dụng phương thức này cho bất kỳ đối tượng nào (bao gồm cả các đối tượng máy chủ), bằng cách sử dụng
Object.prototype.toString.apply(obj);
Nhiều isArray
triển khai sử dụng kỹ thuật này để khám phá xem một đối tượng có thực sự là một mảng hay không (mặc dù nó không mạnh trong IE như trong các trình duyệt khác ).
iii) đối tượng này chứa tất cả các thuộc tính và giá trị của mỗi thuộc tính
Trong ECMAScript 3, bạn có thể lặp qua các thuộc tính có thể liệt kê bằng cách sử dụng một for...in
vòng lặp. Lưu ý rằng hầu hết các thuộc tính tích hợp đều không thể liệt kê được. Điều này cũng đúng với một số đối tượng chủ. Trong ECMAScript 5, bạn có thể lấy một mảng chứa tên của tất cả các thuộc tính không kế thừa bằng cách sử dụng Object.getOwnPropertyNames(obj)
. Mảng này sẽ chứa các tên thuộc tính không liệt kê và có thể liệt kê.