console.log是否调用对象的toString方法
Does console.log invokes toString method of an object?
根据本文档,
附加了每个对象的字符串表示按照列出的顺序一起输出。
同样根据答案
+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,因为有一个类型转换
- toBoolean方法类似于toString
- 将toString方法暴露给nashorn中的js对象
- 为什么控制台没有't使用输入的对象's的`toString`方法
- MongoDB原生:toString和toHexString方法之间有什么区别吗?
- JavaScript:Date 的 toString() 和 toLocaleString() 方法之间的区别
- 方法toString是未定义的JavaScript
- 对象的 toString 方法从哪里获取其值
- console.log是否调用对象的toString方法
- toString 方法打印数组而不是字符串
- 为什么javascript在toString方法中用0代替数字
- 在字符串上使用toString方法是否有任何使用值
- 将日期对象打印为对象,而不是覆盖的tostring方法
- 是什么导致了这个toString方法的不同
- 二叉树的toString方法
- 在数组上自定义.tostring()方法
- 迭代javascript object和valueOf toString方法
- 为什么在Javascript中使用tostring方法将数字转换为字符串?
- jQuery对象' toString() '方法
- 没有toString方法
- 与toString方法相比,使用正则表达式在javascript中进行函数反编译的优势