使用字符串添加时,JavaScript对象如何转换为字符串?

时间:2013-04-27 01:26:57

标签: javascript

当我记录console.log('' + {});之类的内容时,控制台会在Chrome中打印[Object object],但在节点中会显示不同的内容({})。此时我会认为控制台输出取决于执行环境。

然而,最近我发现,鉴于一些非空对象foo,我以某种方式使用Chrome打印null而不是上面的预期输出。因此,使用console.log('' + foo);会在控制台中生成null。怎么可能?我的第一个猜测是,我必须意外地重写一些重要的东西,比如一些toString()方法。否则,我无法解释为什么Chrome会在将某个非空对象添加到字符串时将其解释为null

有谁知道隐式的对象到字符串转换实际上是如何工作的?这并不是一个显示阻止,但它确实让我感到惊讶。

编辑:我没有包含JSFiddle,因为这种情况发生在一些非常依赖性的类中,因此我没有提供适当的最小工作示例。无论如何,这个问题并不是指我的代码,而是相当基础和技术性的。

另一个修改:为了完整起见,我添加了我在评论中发布的screenshot

2 个答案:

答案 0 :(得分:1)

在第一种情况下,区别在于不同环境如何选择在控制台中将对象表示为字符串。它们都意味着相同的东西,即你正在记录的东西是一个对象。如果您在Firefox或Safari中使用开发人员工具进行测试,您可能会看到进一步的差异。

在你的第二个例子中,我怀疑foo的值为空 - 我只是想不到语句console.log('' + foo)如果值null将打印foo的情况null未设置为null,或者正如Xymostech在评论中所说,设置为字符串{{1}}。

答案 1 :(得分:1)

由于您询问了对象到字符串的转换:Object.toString

如果在字符串连接表达式中使用对象,它将调用对象的toString()函数。您可以实现自己的功能,这可能会导致您描述的问题:

function Foo(bar){
  this.bar = bar;
}
Foo.prototype.toString = function fooToString(){
    return this.bar;
};

console.log('' + new Foo(null)); // null

没有看到任何代码,我猜它就是这个,或者它只是字符串"null"。你说你已经检查了toString函数,但确保你也可以在运行时用foo.toString.toSource()打印它。或者只是通过调试器运行对象并检查它。