JavaScript では、ほぼすべてがオブジェクトと見なされることを知っています。受け入れる引数が次の形式であることを特に必要とする関数を作成しています。
{
a: 'b',
c: 'd'
}
したがって、中括弧内のこのタイプのキーと値のペアは、他のタイプのオブジェクトではなく、一種のオブジェクトです。これを具体的に検証する方法は?
JavaScript では、ほぼすべてがオブジェクトと見なされることを知っています。受け入れる引数が次の形式であることを特に必要とする関数を作成しています。
{
a: 'b',
c: 'd'
}
したがって、中括弧内のこのタイプのキーと値のペアは、他のタイプのオブジェクトではなく、一種のオブジェクトです。これを具体的に検証する方法は?
更新: 以下のすべてを書き、後でさらに考えた後、 Trevor's answerをもう一度見てみることをお勧めします。私の答えよりも、その美しい緑色のチェックマークに値すると思います。その理由は次のとおりです。
私はあなたの質問を額面通りに受け取り、それを実行しました。あなたが言ったことを本当に文字通りにしたいのなら、次のような関数が$.isPlainObject()
最適です。しかし、それは本当にあなたがする必要があることですか?$.isPlainObject()
これはあまり効率的な関数ではないことに注意してください。オブジェクトのすべてのプロパティを列挙します。{}
また、以下で説明したように、とを区別できませんnew Object()
。
Trevor は、その代わりに、単に必要なプロパティをチェックすることを提案しています。ほとんどの場合、ほとんどの場合、彼は正しいと思います。これは間違いなく、私が自分のコードで採用しているアプローチに近いものです。つまり、必要なものを検証し、残りは無視します。
ですから、彼の答えをもう一度見て、慎重に検討してください。(そして、チェックマークを動かしても私は気分を害しません!)
今私の元の答え:
$.isPlainObject()
jQueryには関数があります。jQuery を使用していない場合は、この関数のソース コードをアプリにコピーできます。jQuery ソースを開いてを検索しisPlainObject:
ます。
typeof
いずれにせよ、この関数のソースを読んで、 orinstanceOf
チェックほど単純ではないことを確認する価値があります。
isPlainObject: function( obj ) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
return false;
}
try {
// Not own constructor property must be Object
if ( obj.constructor &&
!core_hasOwn.call(obj, "constructor") &&
!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
return false;
}
} catch ( e ) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key;
for ( key in obj ) {}
return key === undefined || core_hasOwn.call( obj, key );
},
type: function( obj ) {
if ( obj == null ) {
return String( obj );
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[ core_toString.call(obj) ] || "object" :
typeof obj;
},
isWindow: function( obj ) {
return obj != null && obj == obj.window;
},
class2type
また、このコードが使用するオブジェクトもあります。
// [[Class]] -> type pairs
class2type = {},
// Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
(これらのコード スニペットは文脈から外れています。スタンドアロンで使用している場合は、構文を微調整する必要があります。)
もちろん、状況によっては、これらすべてのチェックが必要ない場合もあります。また、すでに jQuery を使用している場合は、呼び出すだけ$.isPlainObject()
で詳細を気にする必要はありません。
また、オブジェクト リテラルと で作成されたオブジェクトを区別できないことに注意してくださいnew Object
。
var obj1 = { a:'b', c:'d' };
var obj2 = new Object();
obj2.a = 'b';
obj2.c = 'd';
console.log( $.isPlainObject(obj1) ); // prints true
console.log( $.isPlainObject(obj2) ); // also prints true!
true
どちらもから返され$.isPlainObject()
ます。あなたが考案した他のテストでは、どちらがどちらであるかを判断できないと確信しています。
面白い歴史的メモ: John Resig が 2009 年にこの関数を jQuery に追加したとき、彼はもともとそれを と呼ぶつもりでした$.isObjectLiteral()
。私の勧めで、彼はこのあいまいさのために名前をに変更しました。$.isPlainObject
typeofを使用して
var obj = {x: 1, y: 2};
if (typeof obj == 'object') console.log('im an object');
value
これは が であるかどうか、object
および がプロパティa
および を持っているかどうかをチェックしc
ます。
var value = {a: 1, c: 2};
if (typeof value === "object" && "a" in value && "c" in value)
{
...
}
落とし穴:
typeof
配列の数は「オブジェクト」です
typeof [] === 'object' //true
Array
のインスタンスですObject
Array instanceof Object //true
typeof null
は「オブジェクト」です
typeof null === 'object' //true
これを行うと、次のことを確認できます。
arg
真実です。null
は偽物なので、ここで除草します。typeof arg
「オブジェクト」です。私の知る限り、配列とオブジェクトのみがこれを渡します。最後に、arg
のインスタンスでない場合Array
if(arg && typeof arg === 'object' && !(arg instanceof Array){...}
あなたが説明した状況では、配列やその他の種類のオブジェクトではないことを確認することについて心配する必要はありません。必要なプロパティがあることを確認し、不足している場合はアラームを鳴らしてください。
function needAandC(params) {
if (params.a === undefined || params.c === undefined)
throw new Error('Ahhh.');
// You've got what you need, don't worry what else is there.
}