Heim  >  Artikel  >  Web-Frontend  >  JavaScript bestimmt, ob ein Objekt ein Objekt oder ein Array ist

JavaScript bestimmt, ob ein Objekt ein Objekt oder ein Array ist

黄舟
黄舟Original
2016-12-12 15:21:001196Durchsuche

1.typeof-Operator. Für verschiedene Objekttypen wie Funktion, String, Zahl, Undefiniert usw. ist er voll funktionsfähig, aber wenn es sich um ein Array handelt

var arr=new Array("1","2","3","4","5"); 
alert(typeof(arr));

Sie erhalten eine Objektantwort, die etwas enttäuschend ist.
2 Der Instanzoperator in JavaScript gibt eine zurück Ein boolescher Wert, der angibt, ob das Objekt eine Instanz einer bestimmten Klasse ist.
Verwendung: Ergebnis = Objektinstanz von Klasse, es ist immer noch das Array. Versuchen Sie es noch einmal Mehrere Frames Es entsteht ein großes Problem.

var arrayStr=new Array("1","2","3","4","5"); 
alert(arrayStr instanceof Array);

Der Code

gibt zwei falsche Ergebnisse zurück, was sehr enttäuschend ist.

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 
xArray = window.frames[window.frames.length-1].Array; 
var arr = new xArray("1","2","3","4","5");//这个写法IE大哥下是不支持的,FF下才有 
alert(arr instanceof Array); // false 
alert(arr.constructor === Array); // false
ECMA-262 hat

Object.prototype.toString( ) geschrieben Wenn die toString-Methode aufgerufen wird, werden die folgenden Schritte ausgeführt:
1 [[Klasse]]-Eigenschaft dieses Objekts
2 Verkettung der drei Zeichenfolgen „[object“, Result (1) und „] Return Ergebnis (2)
Die obige Spezifikation definiert das Verhalten von Object.prototype.toString: Rufen Sie zunächst eine interne Eigenschaft [[Klasse]] des Objekts ab und geben Sie dann ein Objekt ähnlich „[object Array]“-String als Ergebnis (jeder, der den ECMA-Standard gelesen hat, sollte wissen, dass [[]] zur Darstellung von Attributen verwendet wird, die intern in der Sprache verwendet werden und von außen nicht direkt zugänglich sind, sogenannte „interne Attribute“). Verwenden dieser Methode Mit dem Aufruf können wir die internen Attribute [[Klasse]] eines beliebigen Objekts abrufen und dann die Typerkennung in einen Zeichenfolgenvergleich umwandeln, um unseren Zweck zu erreichen. Schauen wir uns zunächst die Beschreibung von Array im ECMA-Standard an:
ECMA-262 hat
neues Array([ item0[, item1 [,…]]])
Die [[Class]]-Eigenschaft geschrieben des neu erstellten Objekts auf „Array“ gesetzt ist.
Wenn man sich dies zunutze macht, erscheint die dritte Methode.
Funktion isArray(obj) {
return Object.prototype.toString.call(obj) === '[Objektarray]'; Der Aufruf ändert die Referenz von toString auf das zu erkennende Objekt, gibt die Zeichenfolgendarstellung dieses Objekts zurück und vergleicht dann, ob diese Zeichenfolge „[Objekt““ ist Array]‘, um festzustellen, ob es sich um eine Instanz von Array handelt. Vielleicht möchten Sie fragen, warum nicht o.toString() direkt? Obwohl Array von Object erbt, verfügt es auch über eine toString-Methode. Diese Methode wird jedoch möglicherweise neu geschrieben und erfüllt unsere Anforderungen nicht. Object.prototype ist der Hintern eines Tigers, und nur wenige Menschen wagen es, ihn zu berühren kann seine „Reinheit“ bis zu einem gewissen Grad garantieren :)
Im Gegensatz zu den vorherigen Lösungen löst diese Methode das Problem der rahmenübergreifenden Objektkonstruktion sehr gut. Nach dem Testen ist auch die Kompatibilität mit den wichtigsten Browsern sehr gut, sodass Sie sie bedenkenlos verwenden können. Die gute Nachricht ist, dass viele Frameworks wie jQuery, Base2 usw. planen, diese Methode zu verwenden, um bestimmte Arten spezieller Objekte wie Arrays, reguläre Ausdrücke usw. zu implementieren, ohne sie selbst schreiben zu müssen.

Darüber hinaus wurde auch Ext3 auf diese Schreibweise umgestellt




Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn