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

IT技术 javascript string object console.log
2021-01-16 21:47:38

根据本文档

这些对象中的每一个的字符串表示都按照列出和输出的顺序附加在一起。

也根据答案

+ x 将对象 x 强制转换为字符串,也就是 [object Object]:

所以,我的问题是

如果我做

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

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

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

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

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

4个回答

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

除非您检查特定浏览器的控制台 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"

由于类型不同,它们的字符串表示在控制台 API 中有所不同。如果你查看FF的Console实现的代码,最后一句是

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

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

现在这是一个标准,您可能希望更新您的答案以反映这一点。
2021-03-19 21:47:38
str2 打印类型对象是 Google 的样式指南说“永远不要在原始对象包装器上使用 new”的原因之一
2021-04-12 21:47:38

它不使用 toString,你可以做这样的事情

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

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

console.log(`${obj}`);
这实际上是一个关键点,不应该被低估。
2021-03-13 21:47:38

console.log(str)电话str.valueOf()我猜。来自 JavaScript-权威指南 它的工作是将对象转换为原始值。例如,valueOf()当对象在数值上下文中使用算术运算符(+ 除外)和关系运算符时,将自动调用方法。大多数对象没有合理的原始表示,也没有定义这个方法。

---edit----对不起,复制错误的行,我的意思是""+str,因为有类型转换

不,console.log(str.valueOf())console.log(str) 给出不同的输出
2021-04-08 21:47:38