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

时间:2016-03-25 06:50:49

标签: javascript string object console.log

根据documentation

  

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

另据answer

  

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

所以,我的问题是

如果我这样做

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

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

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

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

请注意 - 这与此question不重复。

4 个答案:

答案 0 :(得分:13)

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

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

如果你看看FF中的实现(可用here - 搜索日志),它的评论如下

  

对象的多行字符串化,专为人类使用而设计

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

根据您的情况,log()为使用literal表示法创建的字符串和使用String构造函数创建的字符串打印两个不同的值,因为它们是两个不同的types。正如here所解释的,使用文字符号创建的字符串称为String Primitives,使用String构造函数创建的字符串称为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";

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

答案 1 :(得分:3)

我猜是

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

---编辑----对不起,复制错误的行,我的意思是“”+ str,因为有一个类型转换

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这是更多键入内容,但也会调用obj.toString()

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