根据本文档,
附加了每个对象的字符串表示按照列出的顺序一起输出。
同样根据答案
+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,因为有一个类型转换