console.log 是否调用对象的 toString 方法?
Does console.log invokes toString method of an object?
根据这个 documentation,
The string representations of each of these objects are appended
together in the order listed and output.
也根据answer
The + x coerces the object x into a string, which is just [object
Object]:
那么,我的问题是
如果我这样做
str = new String("hello")
console.log(str) //prints the string object but not 'hello'
console.log(""+str) //prints "hello"
因此,在第一种情况下,它只是打印对象(不调用 toString()
方法)。
但在第二种情况下,它不会强制转换,而只是打印原始值。为什么会这样?
console.log
调用哪个方法来打印对象?
请注意 - 这不是此 question 的副本。
我猜 console.log(str)
调用 str.valueOf()
。
来自 JavaScript- 权威指南
它的工作是将对象转换为原始值。 valueOf()
方法在数字上下文中使用对象时自动调用,例如,使用算术运算符(+ 除外)和关系运算符。大多数对象没有合理的原始表示,也没有定义这个方法。
---edit----对不起,复制错误的行,我的意思是“”+str,因为有一个类型转换
控制台 API 不是在任何规范中定义的标准 API 而是在所有浏览器中实现的东西,因此供应商通常可以自由地以自己的方式实现没有标准规范来定义 API.
中任何方法的输出
除非您检查特定浏览器的控制台 API 的实际实现,否则您永远无法确定。 GitHub 上有一个 tracker 列出了主要浏览器实现之间的差异。
如果你看看FF中的实现(可用here - 搜索日志),下面有注释
A multi line stringification of an object, designed for use by humans
实际实现检查传递给 log()
的参数类型,并根据它的类型生成不同的表示。
针对您的情况,log()
为使用 literal
表示法创建的字符串和使用 String
构造函数创建的字符串打印两个不同的值,因为它们是两个不同的 types
。正如 here 所解释的那样,使用文字表示法创建的字符串称为 String Primitives
,使用字符串构造函数创建的字符串称为 String Objects
。
var str1 = 'test';
var str2 = new String('hello');
typeof str1 // prints "string"
typeof str2 // prints "object"
由于类型不同,它们在控制台中的字符串表示也不同 API。如果您查看 FF 控制台实现的代码,最后一条语句是
return " " + aThing.toString() + "\n";
因此,为了回答您的问题,FF 中的控制台 API 仅在参数类型不是 {undefined,null,object,set,map}
类型之一时才对参数调用 toString()
。它并不总是调用 toString()
或 valueOf()
方法。我没有检查 Chrome 的实现,所以我不会对此发表评论。
它不使用toString,你可以这样做
clog = function(msg){console.log(msg.toString());}
clog(myObj);
这需要更多的输入,但也会调用 obj.toString()
:
console.log(`${obj}`);
根据这个 documentation,
The string representations of each of these objects are appended together in the order listed and output.
也根据answer
The + x coerces the object x into a string, which is just [object Object]:
那么,我的问题是
如果我这样做
str = new String("hello")
console.log(str) //prints the string object but not 'hello'
console.log(""+str) //prints "hello"
因此,在第一种情况下,它只是打印对象(不调用 toString()
方法)。
但在第二种情况下,它不会强制转换,而只是打印原始值。为什么会这样?
console.log
调用哪个方法来打印对象?
请注意 - 这不是此 question 的副本。
console.log(str)
调用 str.valueOf()
。
来自 JavaScript- 权威指南
它的工作是将对象转换为原始值。 valueOf()
方法在数字上下文中使用对象时自动调用,例如,使用算术运算符(+ 除外)和关系运算符。大多数对象没有合理的原始表示,也没有定义这个方法。
---edit----对不起,复制错误的行,我的意思是“”+str,因为有一个类型转换
控制台 API 不是在任何规范中定义的标准 API 而是在所有浏览器中实现的东西,因此供应商通常可以自由地以自己的方式实现没有标准规范来定义 API.
中任何方法的输出除非您检查特定浏览器的控制台 API 的实际实现,否则您永远无法确定。 GitHub 上有一个 tracker 列出了主要浏览器实现之间的差异。
如果你看看FF中的实现(可用here - 搜索日志),下面有注释
A multi line stringification of an object, designed for use by humans
实际实现检查传递给 log()
的参数类型,并根据它的类型生成不同的表示。
针对您的情况,log()
为使用 literal
表示法创建的字符串和使用 String
构造函数创建的字符串打印两个不同的值,因为它们是两个不同的 types
。正如 here 所解释的那样,使用文字表示法创建的字符串称为 String Primitives
,使用字符串构造函数创建的字符串称为 String Objects
。
var str1 = 'test';
var str2 = new String('hello');
typeof str1 // prints "string"
typeof str2 // prints "object"
由于类型不同,它们在控制台中的字符串表示也不同 API。如果您查看 FF 控制台实现的代码,最后一条语句是
return " " + aThing.toString() + "\n";
因此,为了回答您的问题,FF 中的控制台 API 仅在参数类型不是 {undefined,null,object,set,map}
类型之一时才对参数调用 toString()
。它并不总是调用 toString()
或 valueOf()
方法。我没有检查 Chrome 的实现,所以我不会对此发表评论。
它不使用toString,你可以这样做
clog = function(msg){console.log(msg.toString());}
clog(myObj);
这需要更多的输入,但也会调用 obj.toString()
:
console.log(`${obj}`);