JavaScript / jQueryでオブジェクトのプロパティを取得する方法は?


97

JavaScript / jQueryでは、alertオブジェクトがある場合、[object]または [object Object]

知る方法はありますか:

  1. これら2つのオブジェクトの違いは何ですか

  2. これはどのタイプのオブジェクトですか

  3. このオブジェクトに含まれるすべてのプロパティと各プロパティの値


どうすればJavaScriptオブジェクトを印刷できますか?stackoverflow.com/questions/957537/...
ZOD

私も役立つドキュメントを見つけましたdocs.jquery.com/Types
Saiful

回答:


141

JavaScriptのネイティブfor inループを呼び出すことで、オブジェクトのキーと値を検索できます。

var obj = {
    foo:    'bar',
    base:   'ball'
};

for(var key in obj) {
    alert('key: ' + key + '\n' + 'value: ' + obj[key]);
}

またはjQueryの.each()メソッドを使用:

$.each(obj, function(key, element) {
    alert('key: ' + key + '\n' + 'value: ' + element);
});

6つのプリミティブ型の例外を除いてすべて ECMA- / JavaScriptでオブジェクトです。配列; 関数; すべてがオブジェクトです。これらのプリミティブのほとんどでさえ、実際にはメソッドの選択が制限されたオブジェクトでもあります。必要に応じて、フードの下のオブジェクトにキャストされます。基本クラス名を知るにはObject.prototype.toString、次のようにオブジェクトのメソッドを呼び出すことができます。

alert(Object.prototype.toString.call([]));

上記が出力されます[object Array]

他のいくつかのクラス名は、ありますように[object Object][object Function][object Date][object String][object Number][object Array]、と[object Regex]


31
「すべてがオブジェクトである」、それは真実ではなく、それは言語の大きな誤解の1つです。プリミティブ型と呼ばれるものがあります:数値、文字列、ブール、未定義、ヌル。それらは、プリミティブラッパー、組み込みコンストラクタで作成されたオブジェクトと混同されることがよくあります。たとえばtypeof new String("foo");、「オブジェクト」を生成します。これはラップされたプリミティブ値でありtypeof "foo";、「文字列」を生成します。参照
CMS

私はCMSに同意し、プリミティブ文字列とStringオブジェクトの違いに遭遇すると、特にコードを最小化しようとするときに、自分の機能を実現します。
vol7ron 2010年

7
@CMSそれもまったく真実ではありません。「プリミティブ」文字列、それ自体がオブジェクトです。メソッドの選択が異なるだけです。同様に、数値とブール値を使用します。ただし、UndefinedとNullはメソッドのないプリミティブです。
イズカタ2013年

@Izkataは真実ではありません。 var str = 'primitive'; str.foo = 'bar'; /*wouldn't work*/一方、それvar oStr = new String('string object'); oStr.foo = 'bar'; /*works*/ を抽象化してすべてのオブジェクトと呼ぶ場合は、プリミティブをプリミティブオブジェクトと考えるのをやめることができますが、これは真のJavaScriptオブジェクトのスーパークラスと同等ではありません。
vol7ron、2015

単にconsole.logオブジェクトの検査に使用する
ジョン・スミス

13

オブジェクトのプロパティ/値のリストを取得するには:

  1. Firefoxの場合-Firebug:

    console.dir(<object>);
  2. Slashnickから借用したオブジェクトキーを取得する標準JS :

       var fGetKeys = function(obj){
          var keys = [];
          for(var key in obj){
             keys.push(key);
          }
          return keys;
       }
    
    // Example to call it:
    
       var arrKeys = fGetKeys(document);
    
       for (var i=0, n=arrKeys.length; i<n; i++){
          console.log(i+1 + " - " + arrKeys[i] + document[arrKeys[i]] + "\n");
       }

編集:

  1. <object> 上記のは、オブジェクトへの変数参照に置き換えられます。
  2. console.log() それが何であるかわからない場合は、コンソールで使用することです。 alert()

7

i)これら2つのオブジェクトの違いは何ですか

簡単な答えは、[object]内部クラスを持たないホストオブジェクトを示しているということです。ホストオブジェクトは、使用しているECMAScript実装の一部ではないオブジェクトですが、拡張機能としてホストによって提供されます。DOMはホストオブジェクトの一般的な例ですが、ほとんどの新しい実装では、DOMオブジェクトはネイティブオブジェクトから継承し、内部クラス名(HTMLElementWindowなど)を持っています。IE独自のActiveXObjectは、ホストオブジェクトのもう1つの例です。

[object] 内部クラス名を持たないホストオブジェクトであるため、Internet Explorer 7以前でDOMオブジェクトに警告するときに最もよく見られます。

ii)これはどのタイプのオブジェクトですか

を使用して、オブジェクトの「タイプ」(内部クラス)を取得できますObject.prototype.toString。仕様では、常にの形式[object [[Class]]]で文字列を返す必要があります。[[Class]]は、ObjectArrayDateRegExpなどの内部クラス名です。このメソッドは、次のコマンドを使用して、任意のオブジェクト(ホストオブジェクトを含む)に適用できます。

Object.prototype.toString.apply(obj);

多くのisArray実装は、この手法を使用して、オブジェクトが実際に配列であるかどうかを検出します(IEでは、他のブラウザーほど堅牢ではありません)。


iii)このオブジェクトに含まれるすべてのプロパティと各プロパティの値

ECMAScript 3では、for...inループを使用して列挙可能なプロパティを反復処理できます。ほとんどの組み込みプロパティは列挙できないことに注意してください。同じことがいくつかのホストオブジェクトにも当てはまります。ECMAScript 5では、を使用して、継承されていないすべてのプロパティの名前を含む配列を取得できますObject.getOwnPropertyNames(obj)。この配列には、列挙不可能な列挙可能なプロパティ名が含まれます。


4

これがスパムとしてカウントされないことを願っています。無限のデバッグセッションの後、私は謙虚に関数を書きました:http : //github.com/halilim/Javascript-Simple-Object-Inspect

function simpleObjInspect(oObj, key, tabLvl)
{
    key = key || "";
    tabLvl = tabLvl || 1;
    var tabs = "";
    for(var i = 1; i < tabLvl; i++){
        tabs += "\t";
    }
    var keyTypeStr = " (" + typeof key + ")";
    if (tabLvl == 1) {
        keyTypeStr = "(self)";
    }
    var s = tabs + key + keyTypeStr + " : ";
    if (typeof oObj == "object" && oObj !== null) {
        s += typeof oObj + "\n";
        for (var k in oObj) {
            if (oObj.hasOwnProperty(k)) {
                s += simpleObjInspect(oObj[k], k, tabLvl + 1);
            }
        }
    } else {
        s += "" + oObj + " (" + typeof oObj + ") \n";
    }
    return s;
}

使用法

alert(simpleObjInspect(anyObject));

または

console.log(simpleObjInspect(anyObject));

2

Mozilla Firefox用のFireBugを入手してください

使用する console.log(obj);


1
私はあなたのファイアバグが私のものとどのように異なるかを確認できませんが、オブジェクトの一覧を表示するためにログではなくディレクトリを使用します
vol7ron

console.logと同じくらい効果的ですが、ログのオブジェクトをクリックして「dir」を取得できます...
gnarf

1

Spotlight.jsは、ウィンドウオブジェクトや、特定のものを探す他のホストオブジェクトを反復処理するための優れたライブラリです。

// find all "length" properties
spotlight.byName('length');

// or find all "map" properties on jQuery
spotlight.byName('map', { 'object': jQuery, 'path': '$' });

// or all properties with `RegExp` values
spotlight.byKind('RegExp');

// or all properties containing "oo" in their name
spotlight.custom(function(value, key) { return key.indexOf('oo') > -1; });

あなたはこのためにそれを好きになるでしょう。


0

決定された小道具の最初のインスタンスのためのオブジェクトのスキャン:

var obj = {a:'Saludos',
            b:{b_1:{b_1_1:'Como estas?',b_1_2:'Un gusto conocerte'}},
           d:'Hasta luego'
            }
function scan (element,list){
    var res;
    if (typeof(list) != 'undefined'){
        if (typeof(list) == 'object'){
            for(key in list){
               if (typeof(res) == 'undefined'){
                res = (key == element)?list[key]:scan(element,list[key]);
               }
            });
        }
    }
    return res;
}
console.log(scan('a',obj));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.