3

JavaScript では、ほぼすべてがオブジェクトと見なされることを知っています。受け入れる引数が次の形式であることを特に必要とする関数を作成しています。

{
   a: 'b',
   c: 'd'
}

したがって、中括弧内のこのタイプのキーと値のペアは、他のタイプのオブジェクトではなく、一種のオブジェクトです。これを具体的に検証する方法は?

4

6 に答える 6

2

更新: 以下のすべてを書き、後でさらに考えた後、 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

于 2013-04-05T03:16:42.237 に答える
1

typeofを使用して

var obj = {x: 1, y: 2};
if (typeof obj == 'object') console.log('im an object');
于 2013-04-05T03:14:19.570 に答える
1

valueこれは が であるかどうか、objectおよび がプロパティaおよび を持っているかどうかをチェックしcます。

var value = {a: 1, c: 2};
if (typeof value === "object" && "a" in value && "c" in value)
{
    ...
}
于 2013-04-05T03:16:38.233 に答える
1

落とし穴:

  • 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){...}
    
于 2013-04-05T03:20:17.110 に答える
1

あなたが説明した状況では、配列やその他の種類のオブジェクトではないことを確認することについて心配する必要はありません。必要なプロパティがあることを確認し、不足している場合はアラームを鳴らしてください。

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.
}
于 2013-04-05T03:35:30.230 に答える