0

了解しました。ここでは特別なことは何もありません。JSONだけです。

var a = ["foo", "bar", "baz"];

var o = {a: "foo", b: "bar", c: "baz"};

しかし、これを行うとどうなりますか?

typeof a; // => "object"

そのコマンドで「配列」と言うことができればいいのですが。しかし、私はできません。区別する方法はありますか?

4

5 に答える 5

3

instanceof演算子を使用します。

if (a instanceof Array)

すべての配列はオブジェクトであることに注意してください(オブジェクトは配列のプロトタイプチェーン上にあるため)。したがって、コンストラクターと比較する必要がある配列と非配列を区別するために、Arrayコンストラクターを使用することはできませんObject

于 2012-09-06T11:41:05.480 に答える
2

マルチ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;

それを使用することはお勧めしませんが、それがどのように機能するかを見るのは興味深いことです。

于 2012-09-06T11:41:12.053 に答える
1

オブジェクトがArray:のインスタンスであるかどうかを確認できます。

var isArray = a instanceof Array;
于 2012-09-06T11:43:32.370 に答える
0

別のアプローチは、ダックタイピングを使用することです。ユースケースによって異なります。

たとえば、配列内のアイテムをカウントしたい場合は、JSONオブジェクトで実行できることではありませんが、次のことを試すことができます。

if (typeof(obj.length) !=="undefined"){ //do whatever}

これにより、実際のクラスではなく、オブジェクトの属性に基づいてコードを作成するオプションが提供されます。これは、場合によっては関連性が低くなる可能性があります。

于 2012-09-06T11:45:54.843 に答える
0

ちょうどこれを見つけました:それで何か問題がありますか?

var a = [4,5,6,7];
if(typeof a === object) a.type = "object";
if(a.__proto__ === Array.prototype) a.type = "array";
于 2012-09-06T11:46:20.330 に答える