Es ist, weil {}
als ein gültiger Block zuerst anstelle eines Literals in diesem Kontext gesehen wird.
In einfachen Worten - bedenken Sie, dass Zeile von links nach rechts interpretiert wird, trifft {
und erwartet daher, dass ein Block gestartet wurde. Wenn der Block endet, trifft er auf .
und diese Kennung ist dort nicht erlaubt.
Wenn Sie ({}).toString()
verwenden sollten, wird das funktionieren. Diese
ist, weil die Zeile beginnt mit (
und erwartet daher ein Ausdruck, sie korrekt die {}
als Ausdruck identifiziert, die an ein leeres Objekt ausgewertet und daher‘.toString()` ist erlaubt.
Wenn {}
in einem anderen Kontext verwendet wird - z. In Ihrem Beispiel o = {}
wird dies korrekt als leeres Objekt interpretiert, da es sich auf der rechten Seite einer Zuweisung befindet (nach =
).
Beachten Sie, dass es in ES6 eine ähnliche, aber häufigere/praktischere Situation gibt, in der das Verständnis wichtig ist - wenn Objekte in einzeiligen Pfeilfunktionen, z.
[1,2,3,4].map(val => { v: val, isOdd: v % 2 === 1 }) // ERROR
[1,2,3,4].map(val => ({ v: val, isOdd: v % 2 === 1 })) // OK
Gute Antwort! Kannst du es im Detail erklären und warum passiert das? Vielen Dank. – zhenguoli
[Gruppierung] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Grouping) hat eine höhere [Priorität] (https://developer.mozilla.org/en/ docs/Web/JavaScript/Referenz/Operatoren/Operator_Precedence # Table) als [Mitgliedszugriff] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Dot_notation). –