変数が純粋なObjectインスタンスであるかどうかを確認する必要があります。たとえば、HTMLElementはinstanceof Objectです。しかし、私は実際にであるかどうかを確認する必要がありますのようなオブジェクトです。配列を検証することはできません。オブジェクトがあるかどうかをチェック
注:より良い場合は、Chromeの新しい機能を使用できます。
変数が純粋なObjectインスタンスであるかどうかを確認する必要があります。たとえば、HTMLElementはinstanceof Objectです。しかし、私は実際にであるかどうかを確認する必要がありますのようなオブジェクトです。配列を検証することはできません。オブジェクトがあるかどうかをチェック
注:より良い場合は、Chromeの新しい機能を使用できます。
コンストラクタを確認してください。 Seems to work in all browsers
if (a.constructor === Object)
// Good for arrays
([]).constructor === Object => false
// Good for HTMLElements
document.body.constructor === Object => false
すべての返信ありがとう...しかし、これは私にとって完璧で迅速です。ありがとうございます! –
コンストラクタのプロパティを設定できるので、簡単に偽装できます: 'var a = []; a.constructor = Object; o.constructor ===オブジェクト; // true' – RobG
@RobG確かに、あなたはJSで足で自分を撃つためにできることがたくさんあります。あなたはあなたが提案した 'object .__ proto__'を偽装することもできますが、実際には何かをObjectとするでしょうか? –
var proto = Object.getPrototypeOf(obj);
var protoproto = Object.getPrototypeOf(proto);
if (proto === Object.prototype && protoproto === null) {
//plain object
}
あなたはnull
プロトタイプを持つオブジェクトを作成することがあります場合は、protoproto
を取り除くと、ちょうどObject.prototype
またはnull
へproto
を比較しますことができます。
Object.prototype
自体が渡されるのを防ぐわけではなく、おそらくObject.prototype
という偶発的な拡張を引き起こす危険性があります。
このような小さな短くし、より安全:
var proto = Object.getPrototypeOf(obj);
if (proto && Object.getPrototypeOf(proto) === null) {
// plain object
}
* sidenote:*最小ブラウザバージョン要件:Firefox 3.5、Chrome 5、IE 9.参照:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getPrototypeOf – Raptor
なぜあなたはこれを実行する必要がありますか? – hugomg
実際にオブジェクトがホストオブジェクトかネイティブオブジェクトかどうかを確認しようとしていますか? HTMLElementは必ずしも組み込みObjectオブジェクトのインスタンスではありません。要素はホストオブジェクトであるため、特定の継承パターンに従う必要はありません(一部のブラウザでは実装されていない場合も、Objectのインスタンスとして実装していないブラウザもあります)。 – RobG
jqueryのソースでhttp://api.jquery.com/jQuery.isPlainObject/を見てください。http://code.jquery.com/jquery-1.9.1.jsそして、あなたが盲目になるまでこの質問を閉じてください。 –