49

重複の可能性:
変数が配列であるかどうかを検出する方法

簡単な質問があります:

javascript関数に渡されたパラメーターが配列であるかどうかを検出するにはどうすればよいですか?私はテストできるとは思わない:

if (typeof paramThatCouldBeArray == 'array') 

それでそれは可能ですか?

どうすればいいですか?

前もって感謝します。

4

6 に答える 6

70
if (param instanceof Array)
    ...

編集。Array.isArray2016年の時点で、次のように使用される、より多くのコーナーケースをキャッチする既成のメソッドがあります。

if (Array.isArray(param))
    ...
于 2010-05-04T05:42:09.717 に答える
19

これは、jQuery1.4.2が使用するアプローチです。

var toString = param.prototype.toString;
var isArray = function(obj) {
        return toString.call(obj) === "[object Array]";
    }
于 2010-05-04T05:45:30.160 に答える
5

私はここでこれを見つけました:

function isArray(obj) {
    return obj.constructor == Array; 
}

これも

function isArray(obj) {
    return (obj.constructor.toString().indexOf(”Array”) != -1);
}
于 2010-05-04T05:41:44.817 に答える
1

constructorプロパティをテストできます。

if (param.constructor == Array) {
    ...
}

これには配列プロトタイプを持つオブジェクトが含まれますが、

function Stack() {
}
Stack.prototype = [];

コンストラクターも定義していない限り、次のようになります。

Stack.prototype.constructor = Stack;

また:

function Stack() {
    this.constructor = Stack;
}
于 2010-05-04T05:41:29.593 に答える
1

日前、私は単純な型検出機能を構築していました。おそらくそれはあなたにとって便利でしょう:

使用法:

//...
if (typeString(obj) == 'array') {
  //..
}

実装:

function typeString(o) {
  if (typeof o != 'object')
    return typeof o;

  if (o === null)
      return "null";
  //object, array, function, date, regexp, string, number, boolean, error
  var internalClass = Object.prototype.toString.call(o)
                                               .match(/\[object\s(\w+)\]/)[1];
  return internalClass.toLowerCase();
}

この関数の2番目のバリアントは、 ECMAScript仕様で記述されているオブジェクトタイプのみを返すため"object"、より厳密です(可能な出力値:、、、、、、、、、、、、、内部プロパティを使用) 。"undefined""null""function""array""date""regexp""string""number""boolean" "error"[[Class]]

于 2010-05-04T06:17:04.717 に答える
-1

アヒルのタイピング

実際には、オブジェクトが配列であることを必ずしも確認する必要はありません。ダックタイピングする必要があり、そのオブジェクトに実装させたいのはlengthプロパティだけです。この後、それを配列に変換できます。

var arrayLike = {
    length : 3,

    0: "foo"
};

// transform object to array
var array = Array.prototype.slice.call(arrayLike);

JSON.stringify(array); // ["foo", null, null]

Array.prototype.slice.call(object)プロパティを公開するすべてのオブジェクトを配列に変換しlengthます。たとえば、文字列の場合:

var array = Array.prototype.slice.call("123");
JSON.stringify(array); // ["1", "2", "3"]

この手法はIE6ではうまく機能していませんが(後のバージョンについてはわかりません)、配列内のオブジェクトを変換するための小さなユーティリティ関数を簡単に作成できます。

于 2010-05-04T08:56:44.870 に答える