JSのオブジェクトの型チェックを介して行われるinstanceof
、すなわち
obj instanceof Array
各フレームには独自のArray
オブジェクトがあるため、オブジェクトがフレームの境界を越えて渡される場合、これは機能しません。この問題を回避するには、オブジェクトの内部[[Class]]プロパティを確認します。それを取得するには、Object.prototype.toString()
(これはECMA-262で動作することが保証されています):
Object.prototype.toString.call(obj) === '[object Array]'
どちらの方法も実際の配列でのみ機能し、arguments
オブジェクトやノードリストのような配列のようなオブジェクトでは機能しません。すべての配列のようなオブジェクトには数値length
プロパティが必要なので、次のようにチェックします。
typeof obj !== 'undefined' && obj !== null && typeof obj.length === 'number'
文字列はこのチェックに合格することに注意してください。IEでは文字列の文字へのインデックスによるアクセスが許可されていないため、問題が発生する可能性があります。したがって、に変更typeof obj !== 'undefined'
しtypeof obj === 'object'
て、プリミティブを除外し、タイプが'object'
すべて異なるホストオブジェクトを除外することができます。これにより、文字列オブジェクトを渡すことができますが、手動で除外する必要があります。
ほとんどの場合、実際に知りたいのは、数値インデックスを介してオブジェクトを反復できるかどうかです。したがって、オブジェクトに0
代わりにという名前のプロパティがあるかどうかを確認することをお勧めします。これは、次の確認のいずれかを介して実行できます。
typeof obj[0] !== 'undefined' // false negative for `obj[0] = undefined`
obj.hasOwnProperty('0') // exclude array-likes with inherited entries
'0' in Object(obj) // include array-likes with inherited entries
オブジェクトへのキャストは、配列のようなプリミティブ(つまり文字列)で正しく機能するために必要です。
JS配列の堅牢なチェックのコードは次のとおりです。
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
反復可能な(つまり、空でない)配列のようなオブジェクト:
function isNonEmptyArrayLike(obj) {
try { // don't bother with `typeof` - just access `length` and `catch`
return obj.length > 0 && '0' in Object(obj);
}
catch(e) {
return false;
}
}