控制台 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的实现,所以我不会对此发表评论。