Kann jemand dieses Verhalten in Javascript erklären?

8

Getestet in Firefox:

%Vor%     
mike_e 23.01.2011, 02:50
quelle

2 Antworten

11

Der + Verkettungsoperator verursacht eine toString Auswertung von 0 .

Der Wert von a ist also "0" , während der Wert von b 0 ist.

Von ECMAScript 11.6.1 Der Additionsoperator (+)

  

Der Additionsoperator führt entweder eine String-Verkettung oder eine numerische Addition durch. Die Produktion AdditiveExpression: AdditiveExpression + MultiplicativeExpression wird wie folgt ausgewertet:

     
  1. Lassen Sie lref das Ergebnis der Auswertung von AdditiveExpression sein.

  2.   
  3. Sei lval GetValue (lref).

  4.   
  5. Sei rref das Ergebnis der Auswertung von MultiplicativeExpression.

  6.   
  7. Sei rval GetValue (rref).

  8.   
  9. Sei lprim ToPrimitiv (lval).

  10.   
  11. Sei rprim ToPrimitiv (rval).

  12.   
  13. Wenn Typ (lprim) String oder Typ (rprim) ist String, dann

         

    a. Gibt die Zeichenfolge zurück, die das Ergebnis der Verkettung von ToString (lprim) gefolgt von ToString (rprim)

    ist
  14.   
  15. Gibt das Ergebnis der Additionsoperation an ToNumber (lprim) und ToNumber (rprim) zurück. Siehe die   Hinweis unter 11.6.3.

  16.   

HINWEIS 1 In den Aufrufen von ToPrimitive in den Schritten 5 und 6 wird kein Hinweis angegeben. Alle nativen ECMAScript-Objekte mit Ausnahme von Date-Objekten behandeln das Fehlen eines Hinweises, als ob die Hinweisnummer angegeben wurde. Datumsobjekte verarbeiten die Abwesenheit eines Hinweises, als ob der Hinweis String gegeben wäre. Host-Objekte können die Abwesenheit eines Hinweises auf andere Weise behandeln.

     

ANMERKUNG 2 Schritt 7 unterscheidet sich von Schritt 3 des Vergleichsalgorithmus für die relationalen Operatoren (11.8.5) durch Verwendung der logischen Operation oder der Operation anstelle der logischen Operation.

    
user113716 23.01.2011, 02:53
quelle
3

[] + 0 ist eine Zeichenkette.
Wenn Sie a + b in Javascript schreiben, konvertiert die Engine sowohl a als auch b in Grundelemente.
Wenn mindestens eines der resultierenden Grundelemente eine Zeichenkette ist, führt es eine Zeichenkettenverkettung durch; Andernfalls wird eine numerische Addition durchgeführt.

Um ein Objekt (z. B. ein Array) in ein primitives Element zu konvertieren, ruft die Engine valueOf() auf und ruft, falls das Ergebnis kein primitives Element ist, toString() auf.
Bei Arrays gibt valueOf() das ursprüngliche Array zurück (das kein primitives Objekt ist), und toString() gibt eine durch Komma getrennte Zeichenfolge des Array-Inhalts zurück.

Daher wird [] + 0 zu "" + 0 , was "0" ist.

Nicht leere Strings sind nie falsch.

    
SLaks 23.01.2011 02:53
quelle

Tags und Links