了解しました。ここでは特別なことは何もありません。JSONだけです。
var a = ["foo", "bar", "baz"];
var o = {a: "foo", b: "bar", c: "baz"};
しかし、これを行うとどうなりますか?
typeof a; // => "object"
そのコマンドで「配列」と言うことができればいいのですが。しかし、私はできません。区別する方法はありますか?
了解しました。ここでは特別なことは何もありません。JSONだけです。
var a = ["foo", "bar", "baz"];
var o = {a: "foo", b: "bar", c: "baz"};
しかし、これを行うとどうなりますか?
typeof a; // => "object"
そのコマンドで「配列」と言うことができればいいのですが。しかし、私はできません。区別する方法はありますか?
instanceof
演算子を使用します。
if (a instanceof Array)
すべての配列はオブジェクトであることに注意してください(オブジェクトは配列のプロトタイプチェーン上にあるため)。したがって、コンストラクターと比較する必要がある配列と非配列を区別するために、Array
コンストラクターを使用することはできませんObject
。
マルチwindow
環境を使用していない場合は、コンストラクターを確認できます...
var isArray = possiblyAnArray.constructor == Array;
...または使用instanceof
...
var isArray = possiblyAnArray instanceof Array;
別のウィンドウのコンストラクターが別の参照を保持するため、これらはマルチwindow
環境では機能しません。Array
その場合、あなたはそれをより遅い方法で行う必要があるでしょう...
var isArray = ({}).toString.call(possiblyAnArray) == "[object Array]";
私は別の方法も見ました。これは実装が非常に簡単ですが、正確に何であるかを教えてくれるとはArray
限りません。
Array.prototype.isArray = true;
var isArray = [].isArray;
それを使用することはお勧めしませんが、それがどのように機能するかを見るのは興味深いことです。
オブジェクトがArray
:のインスタンスであるかどうかを確認できます。
var isArray = a instanceof Array;
別のアプローチは、ダックタイピングを使用することです。ユースケースによって異なります。
たとえば、配列内のアイテムをカウントしたい場合は、JSONオブジェクトで実行できることではありませんが、次のことを試すことができます。
if (typeof(obj.length) !=="undefined"){ //do whatever}
これにより、実際のクラスではなく、オブジェクトの属性に基づいてコードを作成するオプションが提供されます。これは、場合によっては関連性が低くなる可能性があります。
ちょうどこれを見つけました:それで何か問題がありますか?
var a = [4,5,6,7];
if(typeof a === object) a.type = "object";
if(a.__proto__ === Array.prototype) a.type = "array";