2149 Stimmen

Wie prüfe ich, ob eine Variable in JavaScript ein Array ist?

Wie prüfe ich, ob eine Variable in JavaScript ein Array ist?

if (variable.constructor == Array)

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.

55voto

Ibu Punkte 41144

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

0 Stimmen

Dies klingt so cool zu mir! Dies könnte nativ sein. btw es funktioniert auch, wenn ein Array vor dem Prototyping erstellt wurde?

5 Stimmen

@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.

38 Stimmen

Angenommen, niemand tut es Object.prototype.isArray = true; ! :(

47voto

Hank Gay Punkte 67607

Ü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.

34voto

JaredMcAteer Punkte 19595

Wenn Sie nur mit EcmaScript 5 und höher arbeiten, können Sie die eingebaute Array.isArray Funktion

z.B.,

Array.isArray([])    // true
Array.isArray("foo") // false
Array.isArray({})    // false

29voto

Brian Punkte 1531

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.

1 Stimmen

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.

0 Stimmen

Zunächst einmal muss ich sagen, dass dies ein bisschen zu hoch für mich ist. Aber wäre ein Test wie dieser robuster?: return Object.prototype.toString.call(o) === Object.prototype.toString.call([]);

20voto

Andy McCluggage Punkte 35822

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.com

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.

Powered by:

X