2017-05-29 1 views
0

Wenn Objekt literal Aufrufe toString() Methode wie {}.toString() wird Syntaxfehler verursachen, aber wenn Array Literal Anruf toString() ist es OK. Und wenn ich das Objektliteral einer Variablen zuweisst, dann ist die Methode toString() OK. Warum? Zum Beispiel:Warum kann literal keinen Aufruf von toString() Methode wie {} .toString() verursachen Fehler?

var o = {}; 
o.toString(); // OK 

{}.toString(); 
// > Uncaught SyntaxError: Unexpected token . 
[1, 2, 3].toString(); // OK 

Vielen Dank!

Antwort

8

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 
+0

Gute Antwort! Kannst du es im Detail erklären und warum passiert das? Vielen Dank. – zhenguoli

+2

[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). –