Permettez-moi d'être plus précis : généralement, une seule des deux méthodes, valueOf et toString, peut être appelée. Selon le type d'objet, il existe des ordres de jugement différents. Plus précisément : 1. Si l'objet doit être converti en chaîne, il détectera d'abord si l'objet a une méthode toString(), l'appellera et renverra la valeur d'origine, puis convertira la valeur en chaîne. Si l'objet n'a pas de méthode toString() ou si cette méthode ne renvoie pas de valeur primitive. Ensuite, js détectera si l'objet a une méthode valueOf(), l'appellera si elle existe, appellera et renverra également la valeur d'origine, puis convertira cette valeur en chaîne. Si ni les méthodes valueOf ni toString de l'objet n'existent, une exception TypeError sera levée. 2. Si l'objet doit être converti en nombre, il détectera s'il possède une méthode valueOf(). S'il ne détecte pas la méthode toString(), le principe spécifique est le même que ci-dessus. 3. Pour tous les objets non-date, la conversion de l'objet en la valeur d'origine est essentiellement la conversion de l'objet en un nombre, et toutes les valeurs de() sont appelées en premier. l'objet en chaîne est utilisé en mode de conversion. Spécifiquement pour votre question, a n'est pas un objet date, donc la méthode valueof() est appelée en premier Après une conversion réussie, la méthode toString() ne sera naturellement plus appelée.
Lors de l'exécution de a+'1', seule la méthode a.valueOf est appelée et la méthode toString n'est pas appelée. Vous pouvez d'abord comprendre le mécanisme des méthodes toValueOf et toString
Parce qu'il s'agit du mécanisme d'analyse de js, votre utilisation de "+" indique le problème de l'utilisation de la conversion implicite. Si vous n'avez pas de dispositions particulières, js appellera automatiquement la méthode toString telle que la conversion. Si vous écrivez valueOf, il sera converti en fonction de valueOf. Bien sûr, toString a une priorité plus élevée
Lorsque vous effectuez l'opération d'addition, vous appellerez uniquement valueOf. Parce qu'il n'est pas imprimé, il n'est pas nécessaire de le convertir en chaîne, et bien sûr, toString ne sera pas déclenché. Si vous l'imprimez comme ceci, vous pouvez voir que les deux méthodes seront appelées :
Permettez-moi d'être plus précis : généralement, une seule des deux méthodes, valueOf et toString, peut être appelée. Selon le type d'objet, il existe des ordres de jugement différents. Plus précisément :
1. Si l'objet doit être converti en chaîne, il détectera d'abord si l'objet a une méthode toString(), l'appellera et renverra la valeur d'origine, puis convertira la valeur en chaîne. Si l'objet n'a pas de méthode toString() ou si cette méthode ne renvoie pas de valeur primitive. Ensuite, js détectera si l'objet a une méthode valueOf(), l'appellera si elle existe, appellera et renverra également la valeur d'origine, puis convertira cette valeur en chaîne. Si ni les méthodes valueOf ni toString de l'objet n'existent, une exception TypeError sera levée.
2. Si l'objet doit être converti en nombre, il détectera s'il possède une méthode valueOf(). S'il ne détecte pas la méthode toString(), le principe spécifique est le même que ci-dessus.
3. Pour tous les objets non-date, la conversion de l'objet en la valeur d'origine est essentiellement la conversion de l'objet en un nombre, et toutes les valeurs de() sont appelées en premier. l'objet en chaîne est utilisé en mode de conversion.
Spécifiquement pour votre question, a n'est pas un objet date, donc la méthode valueof() est appelée en premier Après une conversion réussie, la méthode toString() ne sera naturellement plus appelée.
Lors de l'exécution de a+'1', seule la méthode a.valueOf est appelée et la méthode toString n'est pas appelée. Vous pouvez d'abord comprendre le mécanisme des méthodes toValueOf et toString
.Problème du mécanisme d'analyse JS
Parce qu'il s'agit du mécanisme d'analyse de js, votre utilisation de "+" indique le problème de l'utilisation de la conversion implicite. Si vous n'avez pas de dispositions particulières, js appellera automatiquement la méthode toString telle que la conversion. Si vous écrivez valueOf, il sera converti en fonction de valueOf. Bien sûr, toString a une priorité plus élevée
.Lorsque vous effectuez l'opération d'addition, vous appellerez uniquement valueOf. Parce qu'il n'est pas imprimé, il n'est pas nécessaire de le convertir en chaîne, et bien sûr, toString ne sera pas déclenché.
Si vous l'imprimez comme ceci, vous pouvez voir que les deux méthodes seront appelées :