4 Stimmen

Warum sind rahmen- oder fensterübergreifende Arrays in Javascript so schwer zu erkennen?

Crockford schlägt eine Lösung vor in Javascript: Die guten Seiten um zu erkennen, ob es sich bei einem Objekt um ein Array handelt, das in etwa so funktioniert:

var isArray = function (obj) {
   return obj && typeof obj === "object" && obj.constructor === Array;
}

Aber dann sagt er weiter, dass

...es gelingt nicht, Felder zu identifizieren, die in einem anderen Fenster oder Rahmen erstellt wurden...

Warum funktioniert diese Lösung in dieser Situation nicht?

4voto

Pointy Punkte 387467

Das Symbol "Array" ist etwas, das für jedes Fenster lokal ist. Die Prüfung, ob ein in einem anderen Fenster konstruiertes Objekt einen bestimmten nativen Konstruktor hat, funktioniert daher nicht.

Das heißt: In Fenster 1 gibt es eine "Array"-Konstruktorfunktion. Es gibt auch eine in Fenster #2. Sie sind natürlich gleich, aber sie sind unterschiedlich, weil sie verschiedene Objekte sind. Wenn der Vergleich gemacht wird, wird er so gemacht, wie jeder Objektvergleich gemacht wird: entweder sind die beiden Werte Referenzen auf genau dasselbe Objekt oder sie sind es nicht.

Es ist etwas seltsam, dass JavaScript auf diese Weise funktioniert, aber das liegt in der Natur der Sprache.

1voto

jfriend00 Punkte 632952

JQuery macht eine toString.call(obj) und wenn das Ergebnis lautet "[object Array]" dann seine isArray() Funktion gibt zurück true .

In anderen Fällen, wenn jQuery nur nach einem Array-ähnlichen Objekt sucht (einschließlich DOM-Sammlungen), prüft es einfach, ob es eine .length Eigentum. Das ist natürlich nicht narrensicher, aber es unterscheidet es von einem einfachen Objekt oder einem anderen einfachen Typ.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X