1. 実数の配列を判断する方法
JavaScript で配列を宣言する最も簡単な方法は次のとおりです。
var a = []
それが配列であるかどうかを判断する最も直接的な方法は次のとおりです。
ainstanceof Array //true
a .constructor == Array //true
これには、instanceof 構文が含まれます。instanceof は、「-*/」と同様に、その構文は次のとおりです:
result = obj intanceof class
オブジェクトが特定のクラスのインスタンスであるかどうかを判断するために使用され、演算結果は true または false を返します。 JavaScript のクラスの定義はコンストラクターを通じて初期化されるため、instanceof 構文の右側の演算子クラスは Function のインスタンスである必要があります。つまり、クラス instanceof Function は true である必要があります。instanceof を使用するときに右側の演算子が Function でない場合は、 TypeError 例外が発生します。すべてのオブジェクトは Object のインスタンスであるため、instanceof Object はどのオブジェクトに対しても true を返します。オブジェクトはコンストラクターを通じて初期化されると言いますが、instanceof はオブジェクトが関数によって構築されたかどうかをチェックするのではなく、コンストラクターのプロトタイプによって継承されたかどうかをチェックします。
function Range(low, high) {
this.low = low ;
this.high = high;
}
Range.prototype.constructor == Range; //true
Range.prototype = {
include: function(x){ return (x) >= this.low && x <= this.high) },
exclude: function(x){ return (x < this.low && x > this.high); }
var r = new Range(0, 100);
r インスタンスオブレンジ; //false
r オブジェクト; // true
Range.prototype.constructor == オブジェクト; 🎜>
r は new Range を通じて構築されますが、これが問題です。Range.prototype 代入ステートメントはデフォルトのコンストラクターをオーバーライドし、プロトタイプに値を割り当てません。 Range.prototype.constructor は Range でしたが、代入後は Object になったので、
Range.prototype = {
include: function(x){ return (x >= this.low && x exclude : function(x){ return (x < this.low && x > this.high) }
}
は実際には
include: function(x){ return ( x >= this.low && x <= this.high) },
exclude: function(x){ return (x < this.low && x > this. high); }
});
Range.prototype.constructor == Object の場合、new Range によって作成されたインスタンスは当然 Object のインスタンスです。
公式の説明を読むとより簡単です:
instanceof 演算子は、r が Range コンストラクターによって初期化されたかどうかを実際にはチェックしません。
関数もあります。 JavaScript の typeof は、instanceof に似た関数ですが、数値、文字列、関数、オブジェクト、未定義、ブール値の 6 つの型のみを返します。オブジェクトを返します。つまり、typeof( []) は配列ではなくオブジェクトを返します。
関係するもう 1 つの構文はコンストラクターです。コンストラクターはオブジェクトのコンストラクターを返します:
a.constructor;
コンストラクターはオブジェクトの初期化関数です。オブジェクトが配列の場合、そのコンストラクターはプロトタイプ内のコンストラクターであるため、必ずしも Array である必要はありません。変更される場合があります。
2. 疑似配列の判断方法
JavaScript には疑似配列があり、Array と同様のトラバースメソッドを使用してトラバースできます。長さを取得するための length 属性があります。 [] 添字を使用して、指定された要素を取得できます。この種のオブジェクトは、以下に示すように、疑似配列と呼ばれます。疑似配列かどうかの判定は、length 属性の有無と基本的な配列操作関数 splice の有無を判定するもので、判定方法は以下のとおりです。
戻り値 &&
typeof value === 'object ' &&
値のタイプ.length === '数値' &&
値のタイプ.splice === '関数' &&
!(value.propertyIsEnumerable('length'));
ここで、propertyIsEnumerable は、length 属性が利用可能かどうかを決定するために使用されます。実際、列挙するには、ネイティブ String オブジェクトも Array と同様の効果を持ちますが、これを Array オブジェクトとして扱うことはできません。 typeof は String オブジェクトであり文字列を返すため、ここでは typeof value == "object" と判断する必要があります。