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

使用字符串添加时,JavaScript对象如何转换为字符串?,javascript,Javascript,当我记录类似于console.log(''+{})的东西时控制台将在Chrome中打印[Object Object],但在node中会打印一些不同的内容({})。此时,我认为控制台输出取决于执行环境 然而,最近我发现,考虑到一些notnull对象foo,我不知何故使用了Chrome打印null,而不是上面预期的输出。所以使用console.log(“”+foo)导致控制台中出现null。这怎么可能?我的第一个猜测是我一定是意外地重写了一些重要的内容,比如一些toString()方法。否则,我无法

当我记录类似于
console.log(''+{})的东西时控制台将在Chrome中打印
[Object Object]
,但在node中会打印一些不同的内容(
{}
)。此时,我认为控制台输出取决于执行环境

然而,最近我发现,考虑到一些notnull对象
foo
,我不知何故使用了Chrome打印
null
,而不是上面预期的输出。所以使用
console.log(“”+foo)导致控制台中出现
null
。这怎么可能?我的第一个猜测是我一定是意外地重写了一些重要的内容,比如一些
toString()
方法。否则,我无法解释为什么Chrome会将一些非空对象添加到字符串中时解释为
null

有人知道隐式对象到字符串的转换实际上是如何工作的吗?这并不是说这是一个表演的停止,但它真的让我怀疑

Edit:我没有包含JSFIDLE,因为它发生在一些依赖性很强的类中,所以我无法提供适当的最小工作示例。这个问题并不涉及我的代码,它是相当基本和技术性的


另一个编辑:为了完整起见,我添加了我在评论中发布的内容。

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


在您的第二个示例中,我怀疑
foo
的值为空-我想不出在什么情况下,如果
foo
的值没有设置为
null
或者正如Xymostech在注释中所说的那样,设置为字符串
null

,因为您询问了对象到字符串的转换:

如果在字符串连接表达式中使用对象,它将调用对象的
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()
打印它。或者只是通过调试器运行对象并检查它。

您有JSFIDLE吗?为什么要进行向下投票?一句评论就好了。至于jsFiddle,不,不幸的是没有。这项工作尚未公开。无论如何,我认为我提出这个问题的方式不会有任何帮助。你应该总是为这类问题创建一个最小的工作示例的一个原因是:在创建示例的过程中,你很可能会找到问题的原因。如果你要提出像“非空对象打印出空”这样的声明,你应该提供一些证据证明这是真的。我来这里不是为了争论这些事情。我的观点是,当我执行console.log时(foo==null?“它是null”:foo);在某个时刻,对象被打印出来,正如我所期望的那样。log(“”+(foo==null?’它是null:foo));相反,打印为空,我的问题是这在技术上是如何可能的。如果不是真的,我就不会来这里了。无意冒犯,但我甚至用粗体写了not null。对象不是空的!console.log(foo)!=console.log(“”+foo)。第一个让我检查对象,第二个打印空值。请仔细阅读问题。没有人接受迈克尔,我确实读了问题。我只是想不出在什么情况下,如果foo不是null,那么console.log(“”+foo)语句会打印null。好吧。这就是我提出这个问题的原因。再举一个例子:console.log(“”+(foo==null?’哦,不,它是null!:foo));也打印空。这是我做的第一件事,但它只能在foo不为null时发生。@MichaelJess是
foo
字符串
'null'
?您在评论中发布的语句无效。我认为这只是你的代码中的一个输入错误,而不是一个错误?非常感谢,你确认toString()是正确的,这让我更进一步了,但另一方面,现在我完全糊涂了:“+foo”的计算结果是“null”。“''+foo.toString()''求值为“[Object Object]”。当我重写toString()时,这仍然是一样的。因为在JSFIDLE中,这工作得很好,我认为这是某种依赖性干扰了我很难想象的解释器,因为toString()在这种特殊情况下,似乎根本不会被调用。我会接受这个答案,因为它确实回答了一个问题:当使用字符串添加时,JavaScript对象如何转换为字符串?我实际上认为你使用调试器的想法很好,可以截取这种奇怪的现象:在最新的Chrome和和Firefox版本。