当我记录console.log('' + {});
之类的内容时,控制台会在Chrome中打印[Object object]
,但在节点中会显示不同的内容({}
)。此时我会认为控制台输出取决于执行环境。
然而,最近我发现,鉴于一些非空对象foo
,我以某种方式使用Chrome打印null
而不是上面的预期输出。因此,使用console.log('' + foo);
会在控制台中生成null
。怎么可能?我的第一个猜测是,我必须意外地重写一些重要的东西,比如一些toString()
方法。否则,我无法解释为什么Chrome会在将某个非空对象添加到字符串时将其解释为null
。
有谁知道隐式的对象到字符串转换实际上是如何工作的?这并不是一个显示阻止,但它确实让我感到惊讶。
编辑:我没有包含JSFiddle,因为这种情况发生在一些非常依赖性的类中,因此我没有提供适当的最小工作示例。无论如何,这个问题并不是指我的代码,而是相当基础和技术性的。
另一个修改:为了完整起见,我添加了我在评论中发布的screenshot。
答案 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()
打印它。或者只是通过调试器运行对象并检查它。