2013-02-27 14 views
5

変数が純粋なObjectインスタンスであるかどうかを確認する必要があります。たとえば、HTMLElementはinstanceof Objectです。しかし、私は実際にであるかどうかを確認する必要がありますのようなオブジェクトです。配列を検証することはできません。オブジェクトがあるかどうかをチェック

:より良い場合は、Chromeの新しい機能を使用できます。

+0

なぜあなたはこれを実行する必要がありますか? – hugomg

+0

実際にオブジェクトがホストオブジェクトかネイティブオブジェクトかどうかを確認しようとしていますか? HTMLElementは必ずしも組み込みObjectオブジェクトのインスタンスではありません。要素はホストオブジェクトであるため、特定の継承パターンに従う必要はありません(一部のブラウザでは実装されていない場合も、Objectのインスタンスとして実装していないブラウザもあります)。 – RobG

+1

jqueryのソースでhttp://api.jquery.com/jQuery.isPlainObject/を見てください。http://code.jquery.com/jquery-1.9.1.jsそして、あなたが盲目になるまでこの質問を閉じてください。 –

答えて

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

すべての返信ありがとう...しかし、これは私にとって完璧で迅速です。ありがとうございます! –

+0

コンストラクタのプロパティを設定できるので、簡単に偽装できます: 'var a = []; a.constructor = Object; o.constructor ===オブジェクト; // true' – RobG

+1

@RobG確かに、あなたはJSで足で自分を撃つためにできることがたくさんあります。あなたはあなたが提案した 'object .__ proto__'を偽装することもできますが、実際には何かをObjectとするでしょうか? –

2
var proto = Object.getPrototypeOf(obj); 

var protoproto = Object.getPrototypeOf(proto); 

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

あなたはnullプロトタイプを持つオブジェクトを作成することがあります場合は、protoprotoを取り除くと、ちょうどObject.prototypeまたはnullprotoを比較しますことができます。

Object.prototype自体が渡されるのを防ぐわけではなく、おそらくObject.prototypeという偶発的な拡張を引き起こす危険性があります。


このような小さな短くし、より安全:

var proto = Object.getPrototypeOf(obj); 

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

+0

* sidenote:*最小ブラウザバージョン要件:Firefox 3.5、Chrome 5、IE 9.参照:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getPrototypeOf – Raptor

関連する問題