Frage Wie überprüfen Sie, ob eine Variable ein Array in JavaScript ist? [Duplikat]


Diese Frage hat hier bereits eine Antwort:

Ich möchte überprüfen, ob eine Variable in JavaScript ein Array oder ein einzelner Wert ist.

Ich habe eine mögliche Lösung gefunden ...

if (variable.constructor == Array)...

Ist dies der beste Weg, dies zu tun?


1478
2018-04-20 09:02


Ursprung


Antworten:


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

variable.constructor === Array

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

Wenn Sie feststellen, 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:

variable instanceof Array

Diese Methode läuft ab 1/3 der Geschwindigkeit als erstes Beispiel. Immer noch ziemlich solide, sieht sauberer aus, wenn es um schönen Code geht und nicht so sehr um die Leistung. Beachten Sie, dass das Überprüfen auf Nummern nicht als funktioniert variable instanceof Number kommt immer zurück false. Aktualisieren: instanceof Jetzt geht 2/3 der Geschwindigkeit!

Array.isArray(variable)

Letzteres ist meiner Meinung nach das hässlichste und es ist eines der langsamsten. Laufen etwa 1/5 der Geschwindigkeit als das erste Beispiel. Array.prototype, ist eigentlich ein Array. Sie können hier mehr darüber lesen https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

Also noch ein Update

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

Dieser Typ ist der langsamste, wenn er versucht, nach einem Array zu suchen. Dies ist jedoch 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 einen Test gemacht: http://jsperf.com/instanceof-array-vs-array-isarray/33 Also, habt Spaß und schaut es euch 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, sobald jsperf wieder online ist.


1312
2017-10-29 15:07



Sie könnten auch verwenden:

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

Dies scheint mir eine ziemlich elegante Lösung, aber jedem seine eigene.

Bearbeiten:

Ab ES5 gibt es jetzt auch:

Array.isArray(value);

Dies wird jedoch bei älteren Browsern nicht funktionieren, es sei denn, Sie verwenden Polyfills (im Grunde ... IE8 oder ähnliches).


982
2018-04-20 09:05



Ich bemerkte, jemand erwähnte jQuery, aber ich wusste nicht, dass es ein isArray() Funktion. Es stellt sich heraus, dass es in Version 1.3 hinzugefügt wurde.

jQuery implementiert es so wie Peter es vorschlägt:

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

Da ich bereits sehr viel Vertrauen in jQuery habe (insbesondere in ihre Techniken zur browserübergreifenden Kompatibilität), werde ich entweder auf Version 1.3 upgraden und ihre Funktion nutzen (vorausgesetzt, dass das Upgrade nicht zu viele Probleme verursacht) oder diese vorgeschlagene Methode direkt in meinem verwenden Code.

Vielen Dank für die Vorschläge.


72
2018-04-20 10:10



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

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

71
2018-04-20 09:08



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

Array.isArray(obj)

(Unterstützt durch 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 verwenden es5-shim Polyfill Array.isArray; oder füge 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 verwenden jQuery.isArray(obj) oder $.isArray(obj). Wenn Sie Unterstreichung verwenden, können Sie verwenden _.isArray(obj)

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

obj instanceof Array

Hinweis: das arguments Das Schlüsselwort, das verwendet werden kann, um auf das Argument einer Funktion zuzugreifen, ist kein Array, obwohl es sich (normalerweise) wie eins 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)

54
2018-01-08 07:37



Dies ist eine alte Frage, aber mit dem gleichen Problem 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;

Wenn Sie jetzt 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


49
2017-10-24 21:12



Ü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 Hauptversagen, das Crockford erwähnt, ist die Unfähigkeit, Arrays korrekt zu bestimmen, die in einem anderen Kontext erstellt wurden, z. window. Diese Seite hat eine viel anspruchsvollere Version, wenn dies nicht ausreicht.


45
2018-04-20 09:07



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

Kommentare zu der Post zeigen jedoch, dass, wenn toString() wird überhaupt geändert, diese Art der Überprüfung eines Arrays wird fehlschlagen. Wenn Sie wirklich spezifisch sein und sicher sein wollen toString() wurde nicht geändert, und es gibt keine Probleme mit dem Objektklassenattribut ([object Array] ist das Klassenattribut eines Objekts, das ein Array ist), dann empfehle ich Folgendes:

//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 heißt Array.isArray() wird mit implementiert Object.prototype.toString.call() in ECMAScript 5. Beachten Sie auch, wenn Sie sich Sorgen machen toString()Ändern sich die Implementierung, sollten Sie sich auch Sorgen über jede andere eingebaute Methode zu ändern. Warum verwenden? push()? Jemand kann es ändern! Ein solcher Ansatz ist dumm. Die obige Überprüfung ist eine angebotene Lösung für diejenigen, die sich Sorgen machen toString() ändern, aber ich glaube, dass die Überprüfung unnötig ist.


26
2017-12-03 03:17



Als ich diese Frage gepostet habe, enthielt die von mir verwendete Version von JQuery kein isArray Funktion. Wenn es gewesen wäre, hätte ich wahrscheinlich nur verwendet, dass ich darauf vertraue, dass die Implementierung der beste browserunabhängige Weg ist, um diese spezielle Typprüfung durchzuführen.

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

$.isArray(obj);

(ab Version 1.6.2) Es wird weiterhin mit Vergleichen von Strings im Formular implementiert

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

19
2017-08-08 14:42



Ich dachte, ich würde eine weitere Option für diejenigen hinzufügen, die bereits die Underscore.js-Bibliothek 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.


16
2018-03-16 07:50



Wenn Sie nur mit EcmaScript 5 und höher arbeiten, können Sie das eingebaute verwenden Array.isArrayFunktion

z.B.,

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

13
2017-07-11 14:05