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:
Warum? Wenn ich die Methode valueOf
hinzufüge, wird toString
nicht aufgerufen.
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%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:
Rufen Sie die Methode [[Get]] des Objekts O mit dem Argument "valueOf" auf.
Wenn Ergebnis (1) kein Objekt ist, fahren Sie mit Schritt 5 fort.
Wenn Ergebnis (3) ein primitiver Wert ist, geben Sie Result (3) zurück.
Rufen Sie die Methode [[Get]] von Objekt O mit dem Argument "toString" auf.
Wenn Ergebnis (5) kein Objekt ist, fahren Sie mit Schritt 9 fort.
Da Ihr Objekt valueOf nicht implementiert, wird toString verwendet.
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:
Tags und Links javascript