Die Typprüfung von Objekten in JS erfolgt über instanceof, dh
obj instanceof Array
Dies funktioniert nicht, wenn das Objekt über Frame-Grenzen hinweg übergeben wird, da jeder Frame ein eigenes ArrayObjekt hat. Sie können dies umgehen, indem Sie die interne [[Klasse]] - Eigenschaft des Objekts überprüfen . Verwenden Sie dazu Object.prototype.toString()(dies funktioniert garantiert mit ECMA-262):
Object.prototype.toString.call(obj) === '[object Array]'
Beide Methoden funktionieren nur für tatsächliche Arrays und nicht für Array-ähnliche Objekte wie die argumentsObjekt- oder Knotenlisten. Da alle Array-ähnlichen Objekte eine numerische lengthEigenschaft haben müssen, würde ich Folgendes überprüfen:
typeof obj !== 'undefined' && obj !== null && typeof obj.length === 'number'
Bitte beachten Sie, dass Zeichenfolgen diese Prüfung bestehen, was zu Problemen führen kann, da der IE den Zugriff auf die Zeichen einer Zeichenfolge nach Index nicht zulässt. Daher möchten Sie möglicherweise zu ändern typeof obj !== 'undefined', typeof obj === 'object'um 'object'Grundelemente und Hostobjekte mit Typen auszuschließen, die sich von insgesamt unterscheiden. Dadurch werden weiterhin Zeichenfolgenobjekte passieren, die manuell ausgeschlossen werden müssten.
In den meisten Fällen möchten Sie tatsächlich wissen, ob Sie über numerische Indizes über das Objekt iterieren können. Daher ist es möglicherweise eine gute Idee, zu überprüfen, ob das Objekt 0stattdessen eine Eigenschaft mit dem Namen hat. Dies kann über eine der folgenden Überprüfungen erfolgen:
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
Die Umwandlung in ein Objekt ist erforderlich, um für Array-ähnliche Grundelemente (dh Zeichenfolgen) ordnungsgemäß zu funktionieren.
Hier ist der Code für zuverlässige Überprüfungen von JS-Arrays:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
und iterierbare (dh nicht leere) Array-ähnliche Objekte:
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;
}
}