Warum ruft JS die 'toString' Methode auf, wenn ein Objekt zu einer Nummer hinzugefügt wird

7

Ich weiß, wenn JS versucht, ein Objekt als primitiv darzustellen, ruft es valueOf method für ein Objekt auf. Aber heute habe ich herausgefunden, dass es auch toString() method in derselben Situation aufruft:

%Vor%

Warum? Wenn ich die Methode valueOf hinzufüge, wird toString nicht aufgerufen.

    
AngularInDepth.com 10.07.2016, 10:53
quelle

3 Antworten

8

Alles hängt vom Tipp ab. Wenn Sie 1 + o verwenden, handelt es sich um einen Zahl-Hinweis wegen des Operanden + , also würde definitiv valueOf vor toString verwendet werden.

Wenn der Hinweis String ist, wird toString vor valueOf verwendet. Versuchen Sie zum Beispiel ["o",o].join("=")

Alles zusammen wäre:

%Vor%     
Yehia Awad 10.07.2016, 11:11
quelle
10

Ich nehme an, die Erklärung liegt im Kapitel 8.6.2.6 von ECMA-262 Spezifikation :

  

8.6.2.6 [DefaultValue]

[...]

Wenn die Methode [[DefaultValue]] von O mit Hinweisnummer aufgerufen wird, werden die folgenden Schritte ausgeführt:

  1. Rufen Sie die Methode [[Get]] des Objekts O mit dem Argument "valueOf" auf.

  2. Wenn Ergebnis (1) kein Objekt ist, fahren Sie mit Schritt 5 fort.

  3. Rufen Sie die Methode [[Call]] von Result (1) auf, wobei O als dieser Wert und eine leere Argumentliste verwendet wird.
  4. Wenn Ergebnis (3) ein primitiver Wert ist, geben Sie Result (3) zurück.

  5. Rufen Sie die Methode [[Get]] von Objekt O mit dem Argument "toString" auf.

  6. Wenn Ergebnis (5) kein Objekt ist, fahren Sie mit Schritt 9 fort.

  7. Rufen Sie die Methode [[Call]] von Result (5) auf, mit O als dem Wert und einer leeren Argumentliste.
  8. Wenn Ergebnis (7) ein primitiver Wert ist, geben Sie Result (7).
  9. zurück
  10. Erzeuge einen Laufzeitfehler. Wenn die Methode [[DefaultValue]] von O ohne Hinweis aufgerufen wird, verhält sie sich so, als wäre der Hinweis Nummer, es sei denn, O ist ein Date-Objekt (siehe Abschnitt 15.9), in diesem Fall verhält es sich so, als wäre der Hinweis String.

Da Ihr Objekt valueOf nicht implementiert, wird toString verwendet.

    
Eric MORAND 10.07.2016 11:10
quelle
4

TL; DR

Wenn ToPrimitive ohne hint aufgerufen wird, verhält es sich so, als wäre der Hinweis number . Dies definiert Methoden, die aufgerufen werden: zuerst valueOf dann toString . Wenn Sie Ihre eigene valueOf nicht definiert haben, ruft sie Object.prototype.valueOf auf, die dies zurückgibt.

BTW in modernen Browsern können Sie genauer darüber sein

%Vor%

Lange gelesen:

  1. Zusatz
  2. ToPrimitive
Yury Tarabanko 10.07.2016 11:28
quelle

Tags und Links