javascript - type - jquery check if object is array




Wie überprüfen Sie, ob eine Variable ein Array in JavaScript ist? (16)

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?


Ü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, z. B. window . Diese Seite hat eine viel anspruchsvollere Version, wenn dies nicht ausreicht.


Als ich diese Frage gepostet habe, enthielt die von mir verwendete Version von JQuery keine 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]"

Da die .length-Eigenschaft speziell für Arrays in Javascript ist, können Sie einfach sagen

obj.length === +obj.length // true if obj is an array

Underscorejs und einige andere Bibliotheken verwenden diesen kurzen und einfachen Trick.


Die universelle Lösung ist unten:

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

Ausgehend von ECMAScript 5 ist eine formale Lösung:

Array.isArray(arr)

Auch für alte JavaScript-Bibliotheken finden Sie unter Lösung, obwohl es nicht genau genug ist:

var is_array = function (value) {
    return value &&
    typeof value === 'object' &&
    typeof value.length === 'number' &&
    typeof value.splice === 'function' &&
    !(value.propertyIsEnumerable('length'));
};

Die Lösungen sind von http://www.pixelstech.net/topic/85-How-to-check-whether-an-object-is-an-array-or-not-in-JavaScript


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]'; 
}

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 ungefähr 1/3 der Geschwindigkeit als das erste 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 Zahlen nicht funktioniert, da variable instanceof Number immer false zurückgibt. Update: instanceof geht jetzt 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 mehr darüber hier https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray lesen

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 durchgeführt: http://jsperf.com/instanceof-array-vs-array-isarray/33 Also, Spaß haben und es ausprobieren.

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.


Für diejenigen, die Code-Golf, ein unzuverlässiger Test mit wenigen Zeichen:

function isArray(a) {
  return a.map;
}

Dies wird häufig verwendet, wenn eine Hierarchie durchlaufen / abgeflacht wird:

function golf(a) {
  return a.map?[].concat.apply([],a.map(golf)):a;
}

input: [1,2,[3,4,[5],6],[7,[8,[9]]]]
output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

Ich bemerkte, dass jemand jQuery erwähnte, aber ich wusste nicht, dass es eine isArray() Funktion gab. 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 ihre Techniken für die browserübergreifende Kompatibilität), werde ich entweder auf Version 1.3 upgraden und deren 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.


Ich denke, mit myObj.constructor == Objekt und myArray.constructor == Array ist der beste Weg. Es ist fast 20x schneller als toString (). Wenn Sie Objekte mit Ihren eigenen Konstruktoren erweitern und wollen, dass diese Kreationen als "Objekte" betrachtet werden, dann funktioniert das nicht, aber ansonsten ist es viel schneller. typeof ist genauso schnell wie die Konstruktormethode, aber typeof [] == 'object' gibt wahr zurück, was oft unerwünscht ist. http://jsperf.com/constructor-vs-tostring

Eine Sache zu beachten ist, dass null.constructor einen Fehler auslöst. Wenn Sie also nach Null-Werten suchen, müssen Sie zuerst tun, wenn (testThing! == null) {}


Ich habe diese Codezeile verwendet:

if (variable.push) {
   // variable is array, since AMAIK only arrays have push() method.
}

Ich mochte die Brian Antwort:

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

aber du könntest es einfach so machen:

return Object.prototype.toString.call(o) === Object.prototype.toString.call([]);

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

Kommentare zu diesem Beitrag zeigen jedoch an, dass wenn toString() geändert wird, diese Art der Überprüfung eines Arrays fehlschlagen wird. Wenn Sie wirklich spezifisch sein und sicherstellen möchten, dass toString() nicht geändert wurde und keine Probleme mit dem [object Array] ( [object Array] ist das Klassenattribut eines Objekts, das ein Array ist), dann empfehle ich dies zu tun etwas wie das:

//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, Array.isArray() mit Object.prototype.toString.call() in ECMAScript 5 implementiert ist. Beachten Sie auch, dass Sie sich über toString() 'Gedanken machen müssen. Wenn sich die Implementierung ändert, sollten Sie sich auch darum kümmern, dass jede andere eingebaute Methode sich ändert. Warum benutze 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 über toString() ändern, aber ich glaube, dass die Überprüfung unnötig ist.


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

Array.isArray(obj)

( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray 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 es5-shim zu füllen. 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 jQuery.isArray(obj) oder $.isArray(obj) . Wenn Sie einen Unterstrich verwenden, können Sie _.isArray(obj)

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

obj instanceof Array

Hinweis : Das Schlüsselwort arguments , das für den Zugriff auf das Argument einer Funktion verwendet werden kann, 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)

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



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

z.B,

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




variables