附加每个对象的字符串表示 在列出和输出的顺序中一起。
另据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不重复。
答案 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}`);