Ich habe ein seltsames Verhalten (vielleicht ist es überhaupt nicht komisch, aber ich verstehe nicht warum) mit einem Javascript-Array, das einige Objekte enthält.
Da ich kein Javascript-Profi bin, könnte es sehr wohl eine klare Erklärung dafür geben, warum dies passiert, ich weiß es einfach nicht.
Ich habe JavaScript, das in einem Dokument ausgeführt wird. Es macht ein Array von Objekten ähnlich:
%Vor%Wenn ich dieses Array an dem Ort ausdrucke, an dem es erstellt wurde, wie JSON.stringify (myArray), bekomme ich, was ich erwartet habe:
%Vor%Wenn ich jedoch versuche, auf dieses Array von einem untergeordneten Dokument zu diesem Dokument zuzugreifen (ein Dokument in einem Fenster, das vom ersten Dokument geöffnet wurde), ist das Array kein Array mehr. Wenn Sie also JSON.stringify (parent.opener.myArray) im untergeordneten Dokument ausführen, wird Folgendes angezeigt:
%Vor%Und das war nicht das, was ich erwartet hatte - ich hatte erwartet, dasselbe zu bekommen wie im Elterndokument.
Kann mir jemand erklären, warum das passiert und wie man es repariert, so dass das Array immer noch ein Array ist, wenn es von einem untergeordneten Fenster / Dokument angesprochen wird?
PS. Die Objekte werden nicht wie oben angegeben zum Array hinzugefügt. Sie werden wie folgt hinzugefügt:
%Vor%Wenn das einen Unterschied macht.
Jede Hilfe wird sehr geschätzt, sowohl um mein Problem zu beheben als auch um besser zu verstehen, was vor sich geht:)
Die letzte Zeile könnte das Problem verursachen. Haben Sie versucht, myArray[myArray.length] = obj;
durch myArray.push(obj);
zu ersetzen? Könnte sein, dass, da Sie einen neuen Index explizit erstellen, das Array in ein Objekt verwandelt wird ... obwohl ich hier nur rate. Können Sie den Code hinzufügen, der vom untergeordneten Dokument verwendet wird, das myArray
?
Bearbeiten
Ignoriere das Obige, da es keinen Unterschied macht. Obwohl ich mich nicht rühmen wollte, dachte ich in die richtige Richtung. Meine Idee war, dass der Interpreter, wenn er nur proprietäre Array-Methoden verwendet, dies als Anhaltspunkte für den Typ von myArray
sehen würde. Die Sache ist: myArray
ist ein Array, was das übergeordnete Dokument betrifft, aber da Sie das Array von einem Dokument zu einem anderen übergeben, passiert Folgendes:
Ein Array ist ein Objekt mit einem eigenen Prototyp und Methoden. Wenn Sie es an ein anderes Dokument übergeben, übergeben Sie das gesamte Array-Objekt (Wert und Prototyp) als ein Objekt an das untergeordnete Dokument. Wenn Sie die Variable zwischen Dokumenten übergeben, erstellen Sie effektiv eine Kopie der Variablen (die einzige Zeit, in der JavaScript die Werte einer Variablen kopiert). Da ein Array ein Objekt ist, werden alle seine Eigenschaften (und Prototypmethoden / Eigenschaften) in eine "namenlose" Instanz des Objekts Object
kopiert. Etwas in der Art von var copy = new Object(toCopy.constructor(toCopy.valueOf()));
passiert ... der einfachste Weg, IMO, besteht darin, das Array mit dem übergeordneten Kontext zu stringen, weil dort der Interpreter weiß, dass es ein Array ist:
In diesem Beispiel wird die Variable in dem Kontext angegeben, in dem myArray
weiterhin als echtes JavaScript-Array behandelt wird. Die resultierende Zeichenfolge entspricht also Ihren Erwartungen. Beim Übergeben der JSON-codierten Zeichenfolge von einem Dokument an ein anderes bleibt sie unverändert und daher gibt JSON.parse()
eine genaue Kopie der myArray
-Variablen.
Beachten Sie, dass dies nur ein weiterer wilder Stich im Dunkeln ist, aber ich habe es jetzt ein bisschen genauer durchdacht. Wenn ich falsch liege, kannst du mich korrigieren ... Ich bin immer glücklich zu lernen. Wenn sich dies als wahr herausstellt, lassen Sie es mich auch wissen, da dies für mich früher oder später zweifelsohne eine Falle darstellen wird.
Sehen Sie sich das Ende dieses Artikels Ссылка an für ein Beispiel für dieses Verhalten und Erklärung.
Grundsätzlich kommt es darauf an, dass Array ein systemeigener Typ ist und jeder Rahmen seine eigene Gruppe von Eingeborenen und Variablen hat.
Aus dem Artikel:
%Vor%Ihr Aufruf an JSON.stringify führt die folgende Überprüfung aus (aus der json.js-Quelle), die anscheinend nicht als Array angegeben werden kann:
%Vor%Tags und Links javascript arrays object