2013-02-27 52 views
5

Tôi cần kiểm tra xem biến có phải là một đối tượng thuần túy của đối tượng hay không. Ví dụ: HTMLElement là instanceof Đối tượng. Nhưng tôi thực sự cần kiểm tra xem nó có phải là chỉ một đối tượng, như {a: true, b: false} là. Nó không thể xác nhận một mảng.Kiểm tra xem có phải là một đối tượng

Lưu ý: Tôi có thể sử dụng các tính năng mới hơn của Chrome, nếu tốt hơn.

+0

Tại sao bạn cần phải làm điều này? – hugomg

+0

Bạn có thực sự cố gắng để xem một đối tượng là một máy chủ hoặc đối tượng bản địa? HTMLElement không nhất thiết phải là một thể hiện của đối tượng Object built-in. Các phần tử là các đối tượng lưu trữ và do đó không cần phải theo bất kỳ mẫu thừa kế cụ thể nào (và một số trình duyệt không thực hiện bất kỳ đối tượng nào, cũng như chúng không triển khai thực hiện chúng như các đối tượng của đối tượng). – RobG

+1

xem http://api.jquery.com/jQuery.isPlainObject/ trong nguồn của jquery http://code.jquery.com/jquery-1.9.1.jsand rồi đóng câu hỏi này cho đến khi bạn bị mù –

Trả lời

8

Kiểm tra hàm tạo. Seems to work in all browsers

if (a.constructor === Object) 
// Good for arrays 
([]).constructor === Object => false 
// Good for HTMLElements 
document.body.constructor === Object => false 
+0

Cảm ơn tất cả các câu trả lời ... Nhưng điều này là hoàn hảo và nhanh chóng cho tôi. Cảm ơn bạn! –

+0

Thuộc tính hàm tạo có thể được thiết lập, do đó dễ giả mạo: 'var a = []; a.constructor = Object; o.constructor === Object; // true' – RobG

+1

@RobG Chắc chắn, có rất nhiều điều bạn có thể làm để tự chụp chân mình với JS. Bạn cũng có thể giả mạo 'đối tượng .__ proto__' mà bạn đã gợi ý, nhưng tôi cho rằng điều đó thực sự sẽ làm cho một cái gì đó một đối tượng ??? –

2
var proto = Object.getPrototypeOf(obj); 

var protoproto = Object.getPrototypeOf(proto); 

if (proto === Object.prototype && protoproto === null) { 
    //plain object 
} 

Nếu bạn sẽ được tạo các đối tượng với một nguyên mẫu null, bạn có thể thoát khỏi những protoproto, và chỉ cần so sánh proto-Object.prototype hoặc null.

Sự nguy hiểm của điều đó là nó không bảo vệ chống lại việc bị truyền Object.prototype chính nó, có thể gây ra các tiện ích mở rộng tình cờ là Object.prototype.


ngắn hơn một chút và an toàn hơn như thế này:

var proto = Object.getPrototypeOf(obj); 

if (proto && Object.getPrototypeOf(proto) === null) { 
    // plain object 
} 

+0

* sidenote: * yêu cầu phiên bản trình duyệt tối thiểu: Firefox 3.5, Chrome 5, IE 9. Xem: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getPrototypeOf – Raptor

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