console.log是否调用对象的toString方法

Does console.log invokes toString method of an object?

本文关键字:toString 方法 对象 调用 log 是否 console      更新时间:2023-09-26

根据本文档,

附加了每个对象的字符串表示按照列出的顺序一起输出。

同样根据答案

+x将对象x强制为一个字符串,它只是[object对象]:

所以,我的问题是

如果我做

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

所以,在第一种情况下,它只是打印对象(不调用toString()方法)。

但在第二种情况下,它不强制,而是简单地打印原始值。为什么会这样?

console.log调用哪个方法来打印对象?

请注意,这不是这个问题的重复。

Console API不是在任何规范中定义的标准API,而是在所有浏览器中实现的东西,因此供应商通常可以自由地以自己的方式实现,因为API中没有标准规范来定义任何方法的输出。

除非检查特定浏览器的Console API的实际实现,否则永远无法确定。GitHub上有一个跟踪器,列出了主要浏览器实现之间的差异。

如果你看一下FF中的实现(在这里可以找到-搜索日志),它在下面有一个注释

一种对象的多行字符串化,设计用于人类

实际实现检查传递给log()的参数的类型,并根据其类型生成不同的表示。

在您的案例中,log()会为使用literal表示法创建的字符串和使用String构造函数创建的字符串打印两个不同的值,因为它们是两种不同的types。正如这里所解释的,使用文字表示法创建的字符串被称为String Primitives,使用字符串构造函数创建的字符串则被称为String Objects

var str1 = 'test';
var str2 = new String('hello');
typeof str1 // prints "string"
typeof str2 // prints "object"

由于类型不同,它们的字符串表示在Console API中也不同。如果您浏览FF控制台实现的代码,最后一条语句是

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

因此,为了回答您的问题,只有当参数类型不是{undefined,null,object,set,map}类型之一时,FF中的Console API才会对参数调用toString()。它并不总是调用toString()valueOf()方法。我没有检查Chrome的实现,所以我不会对此发表评论。

这是更多的类型,但也会调用obj.toString()

console.log(`${obj}`);

它不使用toString,你可以做一些类似的事情

clog = function(msg){console.log(msg.toString());}
clog(myObj);
我猜console.log(str)调用str.valueOf()。来自JavaScript-最终指南它的工作是将对象转换为基元值。当对象在数字上下文中使用时,valueOf()方法会自动调用,例如,使用算术运算符(+除外)和关系运算符。大多数对象没有合理的基元表示,也没有定义此方法。

---edit----对不起,复制错了行,我指的是"+str,因为有一个类型转换