218

重複の可能性:
JavaScript:オブジェクトが配列かどうかを確認しますか?

オブジェクトの配列が配列ではなくオブジェクトと見なされるのはなぜですか?例えば:

$.ajax({
    url: 'http://api.twitter.com/1/statuses/user_timeline.json',
    data: { screen_name: 'mick__romney'},
    dataType: 'jsonp',
    success: function(data) {
        console.dir(data); //Array[20]
        alert(typeof data); //Object
    }
});​

フィドル

4

3 に答える 3

325

Javascriptの奇妙な動作と仕様の1つは、typeofArrayがですObject

変数が配列であるかどうかは、次のいくつかの方法で確認できます。

var isArr = data instanceof Array;
var isArr = Array.isArray(data);

しかし、最も信頼できる方法は次のとおりです。

isArr = Object.prototype.toString.call(data) == '[object Array]';

isArray質問にjQueryのタグを付けたので、jQuery関数を使用できます。

var isArr = $.isArray(data);
于 2012-10-21T10:05:51.957 に答える
34

スペックを引用する

15.4配列オブジェクト

配列オブジェクトは、特定のクラスのプロパティ名に特別な扱いをします。プロパティ名P(文字列値の形式)は、ToString(ToUint32(P))がPに等しく、ToUint32(P)が2 ^ 32-1に等しくない場合にのみ、配列インデックスになります。プロパティ名が配列インデックスであるプロパティは、要素とも呼ばれます。すべての配列オブジェクトには、値が常に2^32未満の非負の整数であるlengthプロパティがあります。lengthプロパティの値は、名前が配列インデックスであるすべてのプロパティの名前よりも数値的に大きくなります。Arrayオブジェクトのプロパティが作成または変更されるたびに、この不変条件を維持するために必要に応じて他のプロパティが調整されます。具体的には、名前が配列インデックスであるプロパティが追加されるたびに、長さプロパティは、必要に応じて、その配列インデックスの数値より1つ大きくなるように変更されます。また、lengthプロパティが変更されるたびに、名前が新しい長さ以上の値を持つ配列インデックスであるすべてのプロパティが自動的に削除されます。この制約は、Arrayオブジェクトの独自のプロパティにのみ適用され、プロトタイプから継承される可能性のある長さや配列インデックスのプロパティの影響を受けません。

そしてここにtypeof

ここに画像の説明を入力してください


背景を追加するために、JavaScriptには2つのデータ型があります。

  1. プリミティブデータ型-これには、null、undefined、string、boolean、number、およびobjectが含まれます。
  2. 派生データ型/特殊オブジェクト-これらには、関数、配列、正規表現が含まれます。はい、これらはすべてJavaScriptの「オブジェクト」から派生しています。

JavaScriptのオブジェクトは、ほとんどのオブジェクト指向言語で見られる連想配列/辞書と構造が似ています。つまり、キーと値のペアのセットがあります。

配列は、次のプロパティ/キーを持つオブジェクトと見なすことができます。

  1. 長さ-これは0以上(負ではない)にすることができます。
  2. 配列インデックス。つまり、「0」、「1」、「2」などはすべて配列オブジェクトのプロパティです。

これが、typeofArrayがオブジェクトを返す理由をより明らかにするのに役立つことを願っています。乾杯!

于 2012-10-21T10:17:16.343 に答える
8

この例を試してみると、JavaScriptの連想配列とオブジェクトの違いも理解できます。

連想配列

var a = new Array(1,2,3); 
a['key'] = 'experiment';
Array.isArray(a);

戻り値true

はキーとして扱われるa.lengthため、未定義になることに注意してください。連想配列の長さを取得するために使用する必要があります。 lengthObject.keys(a).length

物体

var a = {1:1, 2:2, 3:3,'key':'experiment'}; 
Array.isArray(a)

戻り値false

JSONはオブジェクトを返します...連想配列を返す可能性があります...しかしそれはそのようではありません

于 2012-10-21T10:42:39.733 に答える