Warum tun diese snippets von JavaScript Verhalten sich anders, obwohl Sie beide einen Fehler?
JS:
var a = {}
var b = {}
try{
a.x.y = b.e = 1 //Uncaught TypeError: Cannot set property 'y' of undefined
} catch(err) {
console.error(err);
}
console.log(b.e) //1
JS:
var a = {}
var b = {}
try {
a.x.y.z = b.e = 1 //Uncaught TypeError: Cannot read property 'y' of undefined
} catch(err) {
console.error(err);
}
console.log(b.e) //undefined
- Ich verstehe es nicht. Es gibt keine syntax-Fehler; ich würde also davon ausgehen, dass
b.z = 1
undb.e = 1
zuerst ausgeführt (gegebenen rechts-Assoziativität auf=
), danna.x.y.z = ...
führen und scheitern; warumb
Zuordnung pass in einem Fall und im anderen nicht? - Wir sind damit einverstanden, dass das Eigentum
y
existiert nicht aufa.x
; aber das gilt in beiden Fällen. Warum muss es verhindern, dass der right-hand-side-Zuordnung im zweiten Fall aber nicht der erste? Was ist anders in der Reihenfolge der Ausführung? (Ich erwähnte Syntax-error, da das timing auf der syntax-Fehler ist sehr Verschieden von der ein runtime error.) - nach dem ausführen von code erhalten Sie Fehler, und als Verwendung als Typ-variable name wieder zu sehen Wert
- Fand diese beschreiben, wie Javascript gehen Zuweisungsoperator ecma-international.org/ecma-262/5.1/#sec-11.13
- Was denkst du, was der Unterschied ist? Haben Sie versucht, auf Grund dieses heraus, bevor Sie Fragen? Was hat Ihre Forschung auftauchen? In anderen Worten, haben Sie Ihre Hausaufgaben machen, bevor Sie Fragen?
- Es ist interessant, aus einer theoretischen Perspektive, aber das fällt definitiv unter die "dies ist der Grund, warum Sie nicht den code schreiben, wie, dass" die Kategorie des unerwarteten Verhalten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich, wenn du die Fehlermeldung Lesen richtig, Fall 1 und Fall 2 werfen unterschiedliche Fehler.
Fall
a.x.y
:Fall
a.x.y.z
:Ich denke, es ist am besten, um es zu beschreiben von Schritt-für-Schritt-Ausführung in einfachem Englisch.
Fall 1
JS:
Fall 2
JS:
In den Kommentaren, Solomon Tam gefunden diese ECMA-Dokumentation über die Zuordnung Betrieb.
Wird die Reihenfolge der Vorgänge wird deutlicher, wenn man Sie nutzen den Komma-operator innerhalb Klammer-notation, um zu sehen, welche Teile ausgeführt werden, wenn:
JS:
JS:
Blick auf die spec:
PutValue
ist, was wirft dieTypeError
:Nichts zugewiesen werden kann, eine Eigenschaft von
undefined
- die[[CanPut]]
interne Methode derundefined
immer wiederfalse
.In anderen Worten: der interpreter parst die linke Seite, dann analysiert der rechten Seite, dann wirft einen Fehler, wenn die Eigenschaft auf der linken Seite kann nichts zugewiesen werden.
Wenn Sie
Der linken Seite ist erfolgreich analysiert bis
PutValue
genannt wird; die Tatsache, dass die.x
- Eigenschaft ausgewertet wirdundefined
ist nicht berücksichtigt, bis die Rechte Seite geparst wird. Der Dolmetscher sieht es als "Weisen Sie einen Wert für die Eigenschaft "y" undefined", und die Zuweisung an eine Eigenschaft vonundefined
nur wirft innerhalbPutValue
.Im Gegensatz:
Den interpreter wird nie zu dem Punkt, wo es versucht zu ordnen, um die
z
Eigenschaft, weil Sie zuerst lösen müssena.x.y
auf einen Wert. Wenna.x.y
aufgelöst Wert (auch zuundefined
), wäre es OK - würde ein Fehler geworfen werden innerhalbPutValue
wie oben. Aber Zugriff aufa.x.y
wirft einen Fehler, weil Eigentumy
kann nicht zugegriffen werden aufundefined
.Betrachten Sie den folgenden code:
JS:
Die grobe Gliederung der Schritte, die erforderlich sind, um den code auszuführen, ist wie folgt ref:
a.x.y
gibt einen Verweis ref, bestehend aus Basis Werta.x
(undefiniert) und referenzierten Namen (y
).y
undefined dem Wert. Dies soll zu werfen, eine TypeError-Ausnahme ref.