2013-02-27 266 views
5

我需要檢查一個變量是否是一個純粹的對象實例。例如:一個HTMLElement是instanceof對象。但是我真的需要檢查一下是否是只有一個對象,比如{a: true, b: false}是。它不能驗證陣列。檢查是否是一個對象

注意:如果更好,我可以使用Chrome的更新功能。

+0

你爲什麼要這麼做? – hugomg 2013-02-27 02:41:03

+0

你真的想看看對象是主機還是本地對象嗎? HTMLElement不一定是內置Object對象的實例。元素是宿主對象,因此不需要遵循任何特定的繼承模式(並且一些瀏覽器不實現任何,也不將它們實現爲對象的實例)。 – RobG 2013-02-27 02:44:30

+1

查看http://api.jquery.com/jQuery.isPlainObject/中jquery的源代碼http://code.jquery.com/jquery-1.9.1.js然後關閉這個問題,直到你失明 – 2013-02-27 02:47:08

回答

8

檢查構造函數。 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

感謝所有回覆......但這對我來說是完美和快速的。謝謝! – 2013-02-27 02:56:52

+0

構造函數屬性可以被設置,所以很容易被欺騙:'var a = []; a.constructor = Object; o.constructor ===對象; // true' – RobG 2013-02-27 03:13:04

+1

@RobG當然,有很多事情可以用JS射擊自己。你也可以欺騙你建議的對象.__ proto__',但我想這實際上會使對象成爲一個東西? – 2013-02-27 03:15:01

2
var proto = Object.getPrototypeOf(obj); 

var protoproto = Object.getPrototypeOf(proto); 

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

如果您要創建一個null原型對象,你可以擺脫protoproto的,只是比較protoObject.prototypenull

這樣做的危險是,它不能防止通過Object.prototype本身,可能導致Object.prototype意外延期。


略短,更安全的是這樣的:

var proto = Object.getPrototypeOf(obj); 

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

+0

*旁註:*分鐘瀏覽器版本要求:Firefox 3.5,Chrome 5,IE 9.請參閱:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getPrototypeOf – Raptor 2013-02-27 02:46:40

相關問題