Website-Suche

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


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

if (variable.constructor == Array)

Antwort #1

Es gibt mehrere Möglichkeiten zu überprüfen, ob eine Variable ein Array ist oder nicht. Die beste Lösung ist die, die Sie gewählt haben.

variable.constructor === Array

Dies ist die schnellste Methode auf Chrome und höchstwahrscheinlich auf allen anderen Browsern. Alle Arrays sind Objekte, daher ist das Überprüfen der Konstruktor-Eigenschaft ein schneller Prozess für JavaScript-Engines.

Wenn Sie Probleme damit haben herauszufinden, ob eine Eigenschaft eines Objekts ein Array ist, müssen Sie zuerst überprüfen, ob die Eigenschaft vorhanden ist.

variable.prop && variable.prop.constructor === Array

Einige andere Möglichkeiten sind:

Array.isArray(variable)

Update 23. Mai 2019 mit Chrome 75, ein Dankeschön an @AnduAndrici, dass er mich mit seiner Frage dazu gebracht hat, dies noch einmal zu überdenken Dieses letzte ist meiner Meinung nach das hässlichste, und es ist eines der langsamsten schnellsten. Es läuft etwa mit 1/5 der Geschwindigkeit des ersten Beispiels. Dieser hier ist etwa 2-5% langsamer, aber das ist schwer zu erkennen. Gut zu verwenden! Ich bin ziemlich beeindruckt vom Ergebnis. Array.prototype ist tatsächlich ein Array. Mehr darüber lesen Sie hier https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

variable instanceof Array

Diese Methode läuft etwa 1/3 so schnell wie das erste Beispiel. Immer noch ziemlich solid, sieht sauberer aus, wenn du Wert auf hübschen Code legst und nicht so sehr auf Leistung. Beachte, dass die Überprüfung auf Zahlen nicht funktioniert, da variable instanceof Number immer false zurückgibt. Update: instanceof läuft jetzt 2/3 so schnell!

Also noch ein weiteres Update

Object.prototype.toString.call(variable) === '[object Array]';

Dieser Typ ist der langsamste, um zu überprüfen, ob es sich um ein Array handelt. Allerdings ist dies eine Anlaufstelle für jeden Typ, den Sie suchen. Da Sie jedoch nach einem Array suchen, verwenden Sie einfach die oben schnellste Methode.

Also, ich habe einige Tests durchgeführt: http://jsperf.com/instanceof-array-vs-array-isarray/35 Also viel Spaß und schau es dir an.

Hinweis: @EscapeNetscape hat einen weiteren Test erstellt, da jsperf.com nicht verfügbar ist. http://jsben.ch/#/QgYAV Ich wollte sicherstellen, dass der ursprüngliche Link bleibt, für den Fall, dass jsperf wieder online ist.

Antwort #2

Sie könnten auch verwenden:

if (value instanceof Array) {
  alert('value is Array!');
} else {
  alert('Not an array');
}

Das scheint mir eine ziemlich elegante Lösung zu sein, aber jedem das Seine.

Bearbeiten :

Ab ES5 gibt es jetzt auch:

Array.isArray(value);

Aber das wird in älteren Browsern nicht funktionieren, es sei denn, Sie verwenden Polyfills (im Grunde... IE8 oder ähnliches).

Antwort #3

In modernen Browsern (und einigen älteren Browsern) können Sie tun

Array.isArray(obj)

(Unterstützt von Chrome 5, Firefox 4.0, IE 9, Opera 10.5 und Safari 5)

Wenn Sie ältere Versionen von IE unterstützen müssen, können Sie es5-shim verwenden, um Array.isArray zu polyfillen; oder fügen Sie Folgendes hinzu

only implement if no native implementation is available
if (typeof Array.isArray === 'undefined') {
  Array.isArray = function(obj) {
    return Object.prototype.toString.call(obj) === '[object Array]';
  }
};

Wenn Sie jQuery verwenden, können Sie jQuery.isArray(obj) oder $.isArray(obj) verwenden. Wenn Sie underscore verwenden, können Sie _.isArray(obj) verwenden.

Wenn Sie keine Arrays erkennen müssen, die in verschiedenen Frames erstellt wurden, können Sie auch einfach instanceof verwenden

obj instanceof Array

Hinweis: Das Schlüsselwort arguments, das verwendet werden kann, um auf die Argumente einer Funktion zuzugreifen, ist kein Array, obwohl es sich (gewöhnlich) wie eines verhält:

var func = function() {
  console.log(arguments)        // [1, 2, 3]
  console.log(arguments.length) // 3
  console.log(Array.isArray(arguments)) // false !!!
  console.log(arguments.slice)  // undefined (Array.prototype methods not available)
  console.log([3,4,5].slice)    // function slice() { [native code] } 
}
func(1, 2, 3)

Antwort #4

Es gibt mehrere Lösungen, jede mit ihren eigenen Besonderheiten. Diese Seite gibt einen guten Überblick. Eine mögliche Lösung ist:

function isArray(o) {
  return Object.prototype.toString.call(o) === '[object Array]'; 
}

Antwort #5

Mir ist aufgefallen, dass jemand jQuery erwähnt hat, aber ich wusste nicht, dass es eine isArray()-Funktion gibt. Es stellt sich heraus, dass sie in Version 1.3 hinzugefügt wurde.

jQuery implementiert es wie Peter vorschlägt:

isArray: function( obj ) {
    return toString.call(obj) === "[object Array]";
},

Nachdem ich bereits viel Vertrauen in jQuery gesetzt habe (insbesondere in ihre Techniken für die Browser-Kompatibilität), werde ich entweder auf Version 1.3 upgraden und ihre Funktion verwenden (vorausgesetzt, dass das Upgrade nicht zu vielen Problemen führt) oder diese vorgeschlagene Methode direkt in meinem Code verwenden.

Vielen Dank für die Vorschläge.

Antwort #6

Das ist eine alte Frage, aber da ich dasselbe Problem habe, habe ich eine sehr elegante Lösung gefunden, die ich teilen möchte.

Das Hinzufügen eines Prototyps zu Array macht es sehr einfach

Array.prototype.isArray = true;

Nun, wenn Sie ein Objekt haben, das Sie testen möchten, um zu sehen, ob es ein Array ist, müssen Sie nur nach der neuen Eigenschaft suchen.

var box = doSomething();

if (box.isArray) {
    // do something
}

isArray ist nur verfügbar, wenn es ein Array ist

Antwort #7

Ü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;
}

Das Haupversagen, das Crockford erwähnt, ist die Unfähigkeit, korrekt zu bestimmen, ob Arrays in einem anderen Kontext erstellt wurden, z. B. window. Diese Seite hat eine weitaus ausgefeiltere Version, falls dies nicht ausreicht.

Antwort #8

Wenn Sie nur mit EcmaScript 5 und darüber arbeiten, können Sie die eingebaute Array.isArray-Funktion verwenden

z. B.

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

Antwort #9

Ich persönlich mag Peters Vorschlag: https://stackoverflow.com/a/767499/414784 (für ECMAScript 3. Für ECMAScript 5, verwenden Sie Array.isArray())

Kommentare zu dem Beitrag deuten jedoch darauf hin, dass, wenn toString() auch nur ein wenig geändert wird, diese Methode, ein Array zu überprüfen, fehlschlägt. Wenn Sie wirklich spezifisch sein möchten und sicherstellen wollen, dass toString() nicht geändert wurde und es keine Probleme mit dem Klassenattribut des Objekts gibt ([object Array] ist das Klassenattribut eines Objekts, das ein Array ist), dann empfehle ich, etwas in dieser Art 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 6. Ausgabe, 7.10, steht, dass Array.isArray() in ECMAScript 5 unter Verwendung von Object.prototype.toString.call() implementiert ist. Beachten Sie auch, dass, wenn Sie sich Sorgen machen, dass sich die Implementierung von toString() ändert, Sie sich auch um jede andere eingebaute Methode sorgen sollten, die sich ändern könnte. Warum push() verwenden? Jemand könnte es ändern! Ein solcher Ansatz ist albern. Die obige Überprüfung ist eine angebotene Lösung für diejenigen, die sich Sorgen über die Änderung von toString() machen, aber ich glaube, die Überprüfung ist unnötig.

Antwort #10

Als ich diese Frage gestellt habe, enthielt die von mir verwendete Version von JQuery keine isArray-Funktion. Hätte sie das getan, hätte ich sie wahrscheinlich einfach verwendet, in dem Vertrauen, dass diese Implementierung die beste browserunabhängige Möglichkeit ist, diese spezielle Typüberprüfung durchzuführen.

Da JQuery diese Funktion jetzt anbietet, würde ich sie immer verwenden...

$.isArray(obj);

(ab Version 1.6.2) Es wird immer noch unter Verwendung von Vergleichen auf Zeichenketten in der Form implementiert

toString.call(obj) === "[object Array]"

Antwort #11

Ich dachte, ich würde eine weitere Option für diejenigen hinzufügen, die die Underscore.js-Bibliothek möglicherweise bereits in ihrem Skript verwenden. Underscore.js hat eine isArray() Funktion (siehe http://underscorejs.org/#isArray).

_.isArray(object) 

Gibt true zurück, wenn das Objekt ein Array ist.

Verwandte Artikel