web-dev-qa-db-fra.com

Console.log appelle-t-il la méthode toString d'un objet?

Selon cette documentation ,

Les représentations sous forme de chaîne de chacun de ces objets sont ajoutées ensemble dans l'ordre indiqué et la sortie.

Aussi selon réponse

Le + x convertit l'objet x en une chaîne, qui n'est que [objet Objet]:

Donc, ma question est

Si je fais

str = new String("hello")
console.log(str) //prints the string object but not 'hello'
console.log(""+str) //prints "hello"

Ainsi, dans le premier cas, il affiche simplement l’objet (n’appelle pas la méthode toString()).

Mais dans le second cas, il ne force pas, mais affiche simplement la valeur primitive. Pourquoi est-ce si?

Quelle méthode console.log appelle-t-il pour imprimer l'objet?

Veuillez noter que - ceci n'est pas un duplicata de cette question .

17
gurvinder372

L'API de console n'est pas une API standard définie dans une spécification, mais implémentée dans tous les navigateurs. Les éditeurs sont donc généralement libres de l'implémenter à leur manière, car aucune spécification standard ne permet de définir la sortie des méthodes de l'API. .

Sauf si vous vérifiez l'implémentation réelle de l'API de console pour un navigateur particulier, vous ne pouvez jamais en être sûr. Il y a un tracker sur GitHub qui répertorie les différences entre les implémentations des principaux navigateurs.

Si vous regardez l'implémentation dans FF (disponible ici - chercher un journal), il y a un commentaire ci-dessous

Une stringification multiligne d'un objet, conçue pour être utilisée par des humains

L'implémentation réelle recherche le type d'argument transmis à log() et, en fonction de son type, génère une représentation différente. 

Dans votre cas, log() imprime deux valeurs différentes pour les chaînes créées à l'aide de la notation literal et les chaînes créées à l'aide du constructeur String, car il s'agit de deux types différentes. Comme expliqué ici , les chaînes créées à l'aide de la notation littérale sont appelées String Primitives et les chaînes créées à l'aide du constructeur String sont appelées String Objects.

var str1 = 'test';
var str2 = new String('hello');

typeof str1 // prints "string"
typeof str2 // prints "object"

Comme les types diffèrent, leur représentation sous forme de chaîne diffère dans l'API de la console. Si vous parcourez le code pour la mise en œuvre de la console FF, la dernière instruction est

return "  " + aThing.toString() + "\n";

Donc, pour répondre à votre question, l’API de console dans FF appelle toString() sur l’argument uniquement si le type d’argument n’est pas l’un des types {undefined,null,object,set,map}. Il n’appelle pas toujours les méthodes toString() ou valueOf(). Je n'ai pas vérifié la mise en œuvre de Chrome, je ne commenterai donc pas cela.

12
Arkantos

console.log(str) appelle str.valueOf() Je suppose que .. De JavaScript - Le guide définitif Son travail consiste à convertir un objet en une valeur primitive. La méthode valueOf() est invoquée automatiquement lorsqu'un objet est utilisé dans un contexte numérique, avec des opérateurs arithmétiques (autres que +) et avec les opérateurs relationnels, par exemple. La plupart des objets n'ont pas de représentation primitive raisonnable et ne définissent pas cette méthode.

--- edit ---- Désolé, copiez la mauvaise ligne, je veux dire le "" + str, car il y a un type de conversion 

3
cyl19910101

Il n'utilise pas toString, vous pouvez faire quelque chose comme ça

clog = function(msg){console.log(msg.toString());}
clog(myObj);
1
A.Zaben