Warum gibt '{} + []' in Javascript ein anderes Ergebnis als 'a = {} + []' zurück?

8

In (mindestens) Firefox Web Console und JSBin bekomme ich

%Vor%

Node.js gibt "[object Object]" in beiden Fällen zurück. Welches Verhalten entspricht der Spezifikation? Wenn der erste, warum?

    
Alexey Romanov 29.08.2013, 11:57
quelle

2 Antworten

15

Wenn in der Browser-Konsole kein = (oder ein anderer Code, der seinen Kontext ändert) vorangestellt wird, wird {} als Block behandelt, kein Objektliteral .

Da der Block leer ist, tut er nichts und bleibt + [] .

Der unäre Plusoperator konvertiert das Array in eine Zahl, die 0 ist.

    
Quentin 29.08.2013, 11:59
quelle
1

Wenn ein Operator für Objekte verwendet wird, sollte der Javascript-Interpreter die Werte mit der Methode valueOf in primitives Format umwandeln, die tatsächlich den internen ToPrimitive-Funktionstyp verwendet, der auf die interne Methode [[DefaultValue]] des Objekts verweist.

Ihr Beispiel mit dem Plus-Operator ist etwas knifflig, weil der Operator sowohl als mathematische Addition als auch als String-Verkettung fungieren kann. In diesem Fall verkettet es Stringdarstellungen der Objekte.

Was wirklich hinter der Szene passiert, ist:

%Vor%

Da das Array leer ist, gibt die toString-Methode eine leere Zeichenfolge zurück. Deshalb sollte das korrekte Ergebnis [object Object] sein, also der Rückgabewert von object.valueOf () toString ().

    
user2585506 29.08.2013 12:26
quelle

Tags und Links