gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:10:00 25 4
gpt4 key购买 nike

据此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 的重复项.

最佳答案

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

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

如果您查看 FF 中的实现(可用 here - 搜索日志),它下面有一条注释

A multi line stringification of an object, designed for use by humans

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

就您的情况而言,log() 为使用 literal 表示法创建的字符串和使用 String 构造函数创建的字符串打印两个不同的值,因为它们是两种不同的类型。正如所解释的here ,使用文字表示法创建的字符串称为字符串基元,使用字符串构造函数创建的字符串称为字符串对象

var str1 = 'test';
var str2 = new String('hello');

typeof str1 // prints "string"
typeof str2 // prints "object"

由于类型不同,它们在控制台 API 中的字符串表示形式也不同。如果您查看 FF 的 Console 实现的代码,最后一条语句是

return "  " + aThing.toString() + "\n";

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

关于javascript - console.log 是否调用对象的 toString 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36215379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com