重複の可能性:
変数が配列であるかどうかを検出する方法
簡単な質問があります:
javascript関数に渡されたパラメーターが配列であるかどうかを検出するにはどうすればよいですか?私はテストできるとは思わない:
if (typeof paramThatCouldBeArray == 'array')
それでそれは可能ですか?
どうすればいいですか?
前もって感謝します。
重複の可能性:
変数が配列であるかどうかを検出する方法
簡単な質問があります:
javascript関数に渡されたパラメーターが配列であるかどうかを検出するにはどうすればよいですか?私はテストできるとは思わない:
if (typeof paramThatCouldBeArray == 'array')
それでそれは可能ですか?
どうすればいいですか?
前もって感謝します。
if (param instanceof Array)
...
編集。Array.isArray
2016年の時点で、次のように使用される、より多くのコーナーケースをキャッチする既成のメソッドがあります。
if (Array.isArray(param))
...
これは、jQuery1.4.2が使用するアプローチです。
var toString = param.prototype.toString;
var isArray = function(obj) {
return toString.call(obj) === "[object Array]";
}
私はここでこれを見つけました:
function isArray(obj) {
return obj.constructor == Array;
}
これも
function isArray(obj) {
return (obj.constructor.toString().indexOf(”Array”) != -1);
}
constructor
プロパティをテストできます。
if (param.constructor == Array) {
...
}
これには配列プロトタイプを持つオブジェクトが含まれますが、
function Stack() {
}
Stack.prototype = [];
コンストラクターも定義していない限り、次のようになります。
Stack.prototype.constructor = Stack;
また:
function Stack() {
this.constructor = Stack;
}
数日前、私は単純な型検出機能を構築していました。おそらくそれはあなたにとって便利でしょう:
使用法:
//...
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]]
実際には、オブジェクトが配列であることを必ずしも確認する必要はありません。ダックタイピングする必要があり、そのオブジェクトに実装させたいのは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ではうまく機能していませんが(後のバージョンについてはわかりません)、配列内のオブジェクトを変換するための小さなユーティリティ関数を簡単に作成できます。