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.

2036voto

jemiloii Punkte 23041

Es gibt mehrere Möglichkeiten zu prü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 in Chrome und höchstwahrscheinlich auch in allen anderen Browsern. Alle Arrays sind Objekte, daher ist die Überprüfung der Konstruktoreigenschaft ein schneller Prozess für JavaScript-Engines.

Wenn Sie Probleme damit haben, herauszufinden, ob eine Objekteigenschaft ein Array ist, müssen Sie zunächst prü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, der mich mit seiner Frage darauf aufmerksam gemacht hat Letztere ist meiner Meinung nach die hässlichste, und sie ist eine der langsamste am schnellsten. Die Geschwindigkeit ist etwa 1/5 so hoch wie beim ersten Beispiel. Dieser Typ ist etwa 2-5% langsamer, aber das ist schwer zu sagen. Solide in der Anwendung! Das Ergebnis ist ziemlich beeindruckend. Array.prototype, ist eigentlich ein Array. Sie können mehr darüber lesen hier https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

variable instanceof Array

Diese Methode dauert etwa 1/3 der Geschwindigkeit als erstes Beispiel. Immer noch ziemlich solide, sieht sauberer aus, wenn Sie alles über schönen Code und nicht so sehr auf die Leistung sind. Beachten Sie, dass die Überprüfung auf Zahlen nicht funktioniert, da variable instanceof Number gibt immer zurück false . Aktualisierung: instanceof geht jetzt 2/3 der Geschwindigkeit!

Also noch ein weiteres Update

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

Dieser Typ ist am langsamsten, wenn er versucht, nach einem Array zu suchen. Allerdings ist dies ein One-Stop-Shop für jede Art, die Sie suchen. Da Sie jedoch nach einem Array suchen, verwenden Sie einfach die schnellste Methode oben.

Außerdem habe ich einige Tests durchgeführt: http://jsperf.com/instanceof-array-vs-array-isarray/35 Also, viel Spaß und probieren Sie es aus.

Hinweis: @EscapeNetscape hat einen weiteren Test erstellt, da jsperf.com nicht erreichbar ist. http://jsben.ch/#/QgYAV Ich wollte sicherstellen, dass der ursprüngliche Link erhalten bleibt, wenn jsperf wieder online geht.

3 Stimmen

Um die gegebene Antwort noch zu erweitern jsperf Test hier mit Hilfe von Eigenschaftstests (.push && .pop), die viel schneller sind und von allen Browsern (auch den alten) unterstützt werden. Der Haken ist, dass ein Objekt vielleicht 'push' und 'pop' Eigenschaften hat, ohne ein Array zu sein. Beachten Sie auch, dass die meisten Tests fehlschlagen, wenn Sie testen, ob ein Objekt, das von einem anderen Frame erstellt (oder übergeben) wurde, ein Array ist (da die Array im gegebenen Fenster ist anders als Array im Rahmenfenster). Außerdem gibt es einen Haken, wenn ein Array über new Array oder wörtlich als [ ] konstruiert wird.

0 Stimmen

Interessant, ich werde noch einige Browsertests durchführen müssen. Chrome 38 auf Centos 7 hat Push & Pop als 10% schneller als Constructor, aber Chrome 39 auf Windows 8 hat Constructor als das schnellste mit keinem engen Vergleich, da Constructor 70% schneller läuft als Push & Pop. Ich werde einfach auf weitere Tests warten, danke!

11 Stimmen

Wenn Sie nicht sicher sind, ob die Variable definiert ist oder ob sie null sein könnte, sollten Sie diese Prüfungen zuerst durchführen, da dies die üblichen Werte/Objekte sind, die keinen Konstruktor haben.

1184voto

Brett Bender Punkte 18860

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.

編集する。

Ab ES5 gibt es nun auch:

Array.isArray(value);

Aber dies wird auf älteren Browsern nicht funktionieren, es sei denn, Sie verwenden Polyfills (im Grunde... IE8 oder ähnlich).

27 Stimmen

Ich schlage vor, eigentlich darauf bestehen, mit diesem "instanceof"-Operator zu bleiben, wenn Sie nicht mit mehreren Rahmen arbeiten. Dies ist der richtige Weg, um den Objekttyp zu überprüfen.

46 Stimmen

Der einzige Fall, in dem dies fehlschlagen würde, ist, wenn Sie versuchen, für ein Array oder Objekt zu testen, da Array instanceof Object == true .

1 Stimmen

Wenn Sie jQuery verwenden, um Elemente mit find('code') oder etwas Ähnlichem zu übergeben, sollten Sie die Variable mit variable instanceof Object da es sich nicht um eine Instanz eines Arrays handelt.

91voto

Fela Punkte 25282

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

Array.isArray(obj)

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

Wenn Sie ältere Versionen des IE unterstützen müssen, können Sie es5-shim um Array.isArray zu vervollständigen; 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) o $.isArray(obj) . Wenn Sie einen Unterstrich verwenden, können Sie _.isArray(obj)

Wenn Sie die in verschiedenen Frames erstellten Arrays nicht erkennen müssen, können Sie auch einfach instanceof

obj instanceof Array

Note : die arguments Schlüsselwort, das verwendet werden kann, um auf das Argument einer Funktion zuzugreifen, ist kein Array, auch wenn es sich (normalerweise) 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)

3 Stimmen

Dies ist wahrscheinlich der beste und modernste Ansatz. Ich habe es zusammen mit dem Polyfill auf MDN gesehen, was bedeutet, dass Mozilla ihm vertraut developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/

0 Stimmen

Vermisst du nicht prototype dort? Scheint, dass es sein sollte Object.prototype.toString.call .

0 Stimmen

Wir können auch feststellen, ob die Objekte über die Methoden verfügen, die im Array vorhanden sind, wie z.B. push, splice, etc.

83voto

Peter Smit Punkte 25936

Es gibt mehrere Lösungen, die alle ihre eigenen Tücken haben. Diese Seite gibt einen guten Überblick. Eine mögliche Lösung ist:

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

0 Stimmen

Wenn Sie genau lesen, steht dort, dass diese Methode erforderlich ist, wenn Sie mit Dokumenten mit mehreren Rahmen arbeiten, was nicht empfehlenswert ist. Diese Methode kann leicht auf eine kleine Änderung in der Funktion "toString" zurückgreifen.

4 Stimmen

Deshalb wird der Link angegeben, damit Brett sie überprüfen und sehen kann, in welchem Fall seine Funktion funktionieren muss

1 Stimmen

Siehe meine Antwort unten. Ich empfehle den Weg von Peter Smit.

76voto

Andy McCluggage Punkte 35822

Ich habe bemerkt, dass jemand jQuery erwähnt hat, aber ich wusste nicht, dass es ein isArray() Funktion. Es stellte 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 (vor allem ihre Techniken für die Cross-Browser-Kompatibilität), werde ich entweder auf Version 1.3 aktualisieren und ihre Funktion verwenden (vorausgesetzt, dass das Upgrade nicht zu viele Probleme verursacht) oder diese vorgeschlagene Methode direkt in meinem Code verwenden.

Vielen Dank für die Anregungen.

0 Stimmen

Siehe dieser Artikel für eine gute Diskussion zu diesem Thema. Die Schlussfolgerung ist, diese Lösung zu verwenden.

1 Stimmen

Dies führt zu der Fehlermeldung SCRIPT65535 im IE10.

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