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

gur*_*372 24 javascript string object console.log

根据此文档,

每个对象的字符串表示按列出和输出的顺序附加在一起.

也作为答案

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

所以,我的问题是

如果我做

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

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

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

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

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

Ark*_*tos 14

Console API不是任何规范中定义的标准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"
Run Code Online (Sandbox Code Playgroud)

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

return "  " + aThing.toString() + "\n";
Run Code Online (Sandbox Code Playgroud)

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