Wie prüfe ich, ob eine Variable in JavaScript ein Array ist?
if (variable.constructor == Array)
Wie prüfe ich, ob eine Variable in JavaScript ein Array ist?
if (variable.constructor == Array)
Dies ist eine alte Frage, aber da ich das gleiche Problem habe, habe ich eine sehr elegante Lösung gefunden, die ich gerne mit Ihnen teilen möchte.
Das Hinzufügen eines Prototyps zu Array macht es sehr einfach
Array.prototype.isArray = true;
Wenn Sie nun ein Objekt haben, das Sie auf ein Array prüfen wollen, müssen Sie nur noch nach der neuen Eigenschaft
var box = doSomething();
if (box.isArray) {
// do something
}
isArray ist nur verfügbar, wenn es sich um ein Array handelt
Dies klingt so cool zu mir! Dies könnte nativ sein. btw es funktioniert auch, wenn ein Array vor dem Prototyping erstellt wurde?
@Vitimtk Ein Prototyp dient als Ersatz für das eigentliche Objekt, so dass dies auch dann funktionieren sollte, wenn das betreffende Array bereits existiert. Es wird natürlich nicht funktionieren, bevor die Quellzeile verarbeitet wurde.
Über Crockford :
function typeOf(value) {
var s = typeof value;
if (s === 'object') {
if (value) {
if (value instanceof Array) {
s = 'array';
}
} else {
s = 'null';
}
}
return s;
}
Der Hauptfehler, den Crockford erwähnt, ist die Unfähigkeit, Arrays korrekt zu bestimmen, die in einem anderen Kontext erstellt wurden, z. B., window
. Auf dieser Seite gibt es eine viel ausgefeiltere Version, falls dies nicht ausreicht.
Mir persönlich gefällt der Vorschlag von Peter: https://stackoverflow.com/a/767499/414784 (für ECMAScript 3. Für ECMAScript 5, verwenden Sie Array.isArray()
)
Die Kommentare zu diesem Beitrag zeigen jedoch, dass, wenn toString()
überhaupt geändert wird, schlägt diese Art der Überprüfung eines Arrays fehl. Wenn Sie wirklich genau sein wollen und sicherstellen wollen, dass toString()
wurde nicht geändert, und es gibt keine Probleme mit dem Attribut der Objektklasse ( [object Array]
ist das Klassenattribut eines Objekts, das ein Array ist), dann empfehle ich, etwas wie folgt zu tun:
//see if toString returns proper class attributes of objects that are arrays
//returns -1 if it fails test
//returns true if it passes test and it's an array
//returns false if it passes test and it's not an array
function is_array(o)
{
// make sure an array has a class attribute of [object Array]
var check_class = Object.prototype.toString.call([]);
if(check_class === '[object Array]')
{
// test passed, now check
return Object.prototype.toString.call(o) === '[object Array]';
}
else
{
// may want to change return value to something more desirable
return -1;
}
}
Beachten Sie, dass in JavaScript The Definitive Guide 6th edition, 7.10, es heißt Array.isArray()
wird implementiert mit Object.prototype.toString.call()
in ECMAScript 5. Beachten Sie auch, dass, wenn Sie sich Gedanken über toString()
Wenn sich die Implementierung einer Methode ändert, sollten Sie sich auch Sorgen machen, dass sich jede andere eingebaute Methode ebenfalls ändert. Warum verwenden push()
? Jemand kann es ändern! Ein solcher Ansatz ist albern. Die obige Prüfung ist ein Lösungsvorschlag für diejenigen, die sich Sorgen machen über toString()
ändern, aber ich glaube, dass die Überprüfung unnötig ist.
Gute Entscheidung für den ECMAScript-5-Standard. Natürlich kann man nicht garantieren, dass der Browser ihn unterstützt, aber dies sollte die erste Möglichkeit sein, neuen Code zu überprüfen.
Als ich diese Frage stellte, enthielt die Version von JQuery, die ich verwendete, keine isArray
Funktion. Wenn es hatte, würde ich wahrscheinlich nur verwendet haben, im Vertrauen darauf, dass die Implementierung der beste Browser-unabhängige Weg, um diese besondere Typ-Prüfung durchzuführen sein.
Da JQuery diese Funktion nun anbietet, würde ich sie immer verwenden...
$.isArray(obj);
(ab Version 1.6.2) Es wird immer noch mit Vergleichen auf Strings in der Form
toString.call(obj) === "[object Array]"
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
3 Stimmen
Die Prüfung, ob ein Objekt ein Array ist, hat einige spezifische Vorbehalte... Die Antwort von Peter ist die einzige, die Sie verwenden sollten.
1 Stimmen
@Andy Es scheint, dass meine Antwort nicht die beste ist. Vielleicht sollten Sie eine andere Antwort als akzeptiert auswählen?
2 Stimmen
Gutes Argument, Peter. Mir war nicht klar, dass Ihre Antwort solche Kommentare erhält. Ich glaube, ich habe längst begonnen, die JQuery.isArray-Funktion zu verwenden, wenn ich nach Arrays suche, und interessanterweise ist das anders implementiert als jede andere Antwort, die hier gegeben wurde. Ich habe die beliebte Antwort als richtig markiert.
2 Stimmen
Das ist leider falsch. Ich habe ein wenig tiefer geschaut und (ab Version 1.6.2) JQuery prüft immer noch den Typ mit Vergleichen in der Form.... toString.call(obj) === "[object Array]"
1 Stimmen
Für IE8-Unterstützung würde ich Folgendes tun
if ('push' in variable.__proto__)
ist der schnellste und vielleicht beste Weg, um zu prüfen, ob eine Variable ein Array ist.0 Stimmen
jsben.ch/#/QgYAV - ein Benchmark der häufigsten Wege
0 Stimmen
stackoverflow.com/questions/4775722/check-if-object-is-array/
8 Stimmen
"Diese Frage wurde schon einmal gestellt" ... NEIN, diese Frage wurde NACH dieser Frage gestellt