2010-02-15 15 views
24

So habe ich eine Funktion, wenn ein Argument ein Objekt überprüfen muß, aber dies nicht, weilWie überprüft man, ob ein Objekt kein Array ist?

typeof [] // returns 'object' 

Dies ist ein klassisches Javascript gotcha, aber ich kann nicht daran erinnern, was eigentlich zu tun, um Objekte zu akzeptieren, aber keine Arrays.

+2

duplizieren: http://stackoverflow.com/questions/1202841/what-ist-best-way-to-check-if-an-object-is-anarray- or-not-in-javascript –

Antwort

30

versuchen, etwas wie folgt aus:

obj.constructor.toString().indexOf("Array") != -1 

oder (noch besser)

obj instanceof Array 
+0

es scheint, dass dein erster Vorschlag der sicherste ist und auch das von @Pointy angegebene Problem beheben würde. Danke :) – hojberg

+0

oder um genauer zu sein: Object.prototype.toString.call (obj) === '[object Array]'; – hojberg

+1

jQuery hat eine Hilfsmethode 'isArray()'. http://api.jquery.com/jQuery.isArray/ @hojberg Ich zurück deinen Weg es zu tun.jQuery macht das selbe. –

2

Sie dies versucht:

var test = []; 
if(test instanceof Array) { 
... 
} 

EDIT: Diese Methode funktioniert nicht in Multi-Frame-DOM-Umgebungen (‘typeof’ considered useless - or how to write robust type checks). (über)

+0

Nicht wirklich eine gute Lösung. Siehe http://juhukinners.com/2009/01/11/typeof-considered-useless-or-how-to-write-robust-type-checks/ – Pointy

+0

Guter Punkt. Das wusste ich nicht. –

17

Alle diese Antworten, die darauf hindeuten, dass Sie überprüfen (auf die eine oder andere Weise), ob ein Objekt eine Instanz der "Array" -Klasse ist (dh von "Array" konstruiert), sind wirklich nicht sichere Lösungen. Sie werden manchmal arbeiten, vielleicht die meiste Zeit, aber alle wichtigen Frameworks haben sich von diesem Ansatz entfernt. Eines der Hauptprobleme mit ihm kommt, wenn es gibt Interaktion zwischen mehreren Fenstern (im Allgemeinen, ein übergeordnetes Fenster und einem oder mehr Rahmen oder iframe Windows). Wenn Sie ein Array-Objekt, das in einem Fenster erstellt wurde, an eine API weitergeben, die sich in einem anderen Fenster befindet, schlagen alle diese Tests fehl. Warum? Denn das, was Sie testen, ob ein Objekt eine Instanz der „Array“ Klasse ist in Ihrem lokalen Fenster Kontext. Mit anderen Worten, wenn Sie "Array" in

if (myobject instanceof Array) { ... } 

verweisen, was Sie Referenzierung ist window.Array, natürlich. Nun, ein Array aufgebaut in ein weiteres Fenster ist nicht geht eine Instanz der Array-Klasse in Ihrem Fenster sein!

den Konstruktor Name Checking ist wahrscheinlich ein wenig sicherer, obwohl es immer noch riskant ist. Meiner Meinung nach ist es besser, wenn Sie einen Tipp tippen. Das heißt, anstatt zu fragen: "Ist das ein Array?" fragen Sie stattdessen, "scheint dieses Objekt bestimmte bestimmte Array-APIs zu unterstützen, die ich unter diesen Umständen brauche?" Zum Beispiel: "Besitzt dieses Objekt eine length Eigenschaft?" Javascript ist eine ziemlich "weiche" Sprache und alles ist veränderbar. So, auch wenn Sie etwas herausfinden, tun wurde durch „Array“ konstruiert, Sie noch weiß wirklich nicht sicher, was Sie damit machen können oder zu ihm.

[Bearbeiten] Danke für den Link, @Lachlan - hier ist eine sehr klare Beschreibung der Themen: http://juhukinners.com/2009/01/11/typeof-considered-useless-or-how-to-write-robust-type-checks/

+0

+1 für großartige Erklärung. Vielen Dank für Ihre Aufmerksamkeit. –

3

Für das, was es wert ist, hier ist, wie jQuery überprüft, ob etwas ein Array ist:

isArray: function(arr) { 
    return !!arr && arr.constructor == Array; 
} 

Aber this article empfiehlt es wie dies zu tun:

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

Um zu bestimmen, ob ein bestimmtes Objekt ein Array ist, stellt 5 ECMAScript die Array.isArray() Methode, die derzeit in allen modernen Browsern unterstützt wird. Siehe hierzu ECMAScript compatibility table.Um die Klasse eines bestimmten Objekts zu ermitteln, können Sie die Object.prototype.toString()-Methode verwenden.

Object.prototype.toString.call({}); // "[object Object]" 
 
Object.prototype.toString.call([]); // "[object Array]"

2

Arrays sind Objekte in Javascript, nachdem alle, so alles, was Sie tun müssen, wenn die Art der Variable zu überprüfen ist, ein Objekt ist und in der gleichen Zeit ist dieses Objekt nicht Instanz von Array Klasse.

var obj = {fname:'John',lname:'Doe'}; 

if(typeof obj === 'object' && !(obj instanceof Array)){ 
    return true ; 
} else { 
    return false; 
} 
+0

Während dies eine gültige Antwort sein kann, sind Sie viel eher anderen zu helfen, indem Sie erklären, was der Code tut und wie er funktioniert. Nur-Code-Antworten erhalten weniger positive Aufmerksamkeit und sind nicht so nützlich wie andere Antworten. – Aurora0001

+1

@ Aurora0001 wahrscheinlich hast du recht, hier ist eine einfache Beschreibung :) –

0

var obj = {first: 'Stack', last: 'Overflow'}; 
 
// var obj = ['Stack', 'overflow']; //You can uncomment this line and comment the above to check.. 
 

 
if(Object.prototype.toString.call(obj) !== '[object Array]') { 
 
    //your code.. 
 
    var str = ''; 
 
    for(var k in obj) { 
 
    \t str = str + obj[k] + ' '; 
 
    } 
 
    console.log('I love ', str); 
 
    alert('I love ' + str); 
 
} else { 
 
\t console.log('Could not process. Probably an array'); 
 
    alert('Could not process. Probably an array'); 
 
} 
 

 
console.log('Length is: ', Object.keys(obj).length); 
 
alert('Length is: ' + Object.keys(obj).length);

Lassen input ein kein Array für alte Browser ist sein Array oder Object

Um zu überprüfen, ob ein Objekt ein Array
if(Object.prototype.toString.call(input) === '[object Array]') {}

Um zu prüfen ist, ob ein Objekt eine Object
if(Object.prototype.toString.call(input) === '[object Object]') {}


Bitte ist zu beachten Object.keys(input).length Sie die Länge für beide zurück Array und Objekt

JS Fiddle example für die gleiche

2

, wenn etwas zu testen, ist eine Instanz eines Array:

const arr = [1,2,3]; 
Array.isArray(arr); // true 

ist Um zu testen, etwas ist eine Instanz eines Objekt:

const obj = { 1: 'a', 2: 'b', 3: 'c' }; 
obj.constructor === Object; // true 

Hinweis Letzteres würde einen Fehler werfen, wenn objnull oder undefined ist, in diesem Fall könnten Sie verwenden: typeof obj === 'object' oder machen Sie einfach einen Null-Check: obj && obj.constructor === Object.

1

Verwenden Sie bitte Object.prototype.toString.call({}).slice(8,-1)==="Object" Dies funktioniert für alle Datentypen Sie können den Parameter innerhalb der Aufruffunktion und den Vergleich auch für die Überprüfung auf verschiedene Datentypen ersetzen. es funktioniert auch für null überprüfen

Verwandte Themen