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)
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.
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.
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!
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.
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).
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.
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
.
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.
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)
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/
Vermisst du nicht prototype
dort? Scheint, dass es sein sollte Object.prototype.toString.call
.
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]';
}
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.
Deshalb wird der Link angegeben, damit Brett sie überprüfen und sehen kann, in welchem Fall seine Funktion funktionieren muss
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.
Siehe dieser Artikel für eine gute Diskussion zu diesem Thema. Die Schlussfolgerung ist, diese Lösung zu verwenden.
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