2013-04-27 61 views
2

当我登录诸如console.log('' + {});之类的东西时,控制台会在Chrome中打印[Object object],但在节点中有些不同({})。在这一点上,我会认为控制台输出取决于执行环境。使用字符串添加时,JavaScript对象如何转换为字符串?

但是,最近我发现,给予一定的不是空对象foo,我莫名其妙地有镀铬打印null代替上述预期的输出。因此在控制台中使用console.log('' + foo);导致null。这怎么可能?我的第一个猜测是我必须无意中重写了一些重要的东西,比如一些toString()方法。否则,我无法解释为什么当Chrome添加到字符串时,Chrome会将一些非空对象解释为null

有谁知道隐式的对象到字符串转换实际上是如何工作的吗?这并不是说这是一场表演,但它真的让我感到惊讶。

编辑:我没有包含一个JSFiddle,因为这发生在一些相当重的依赖类中,所以没有我可以为您提供的适当的最小工作示例。无论如何,这个问题并没有提及我的代码,这是相当基础和技术性的。

另一编辑:为了完整起见,我将screenshot添加到评论中。

+3

你有jsFiddle吗? – Dennis 2013-04-27 01:29:23

+2

为什么downvote?评论会很好。至于jsFiddle,不,不幸的不是。这项工作仍未公开。无论如何,我提出这个问题的方式我认为不会有帮助。 – 2013-04-27 01:40:00

+0

为什么你应该总是为这类问题创建一个最小工作示例的一个原因是:在创建示例的过程中,最有可能找到问题的原因。 – Kapep 2013-04-27 01:56:40

回答

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()打印它。或者只是通过调试器运行对象并检查它。

+0

非常感谢你,确认toString()是正确的东西让我看到了更多,但另一方面,现在我完全困惑:“''+ foo”评估为“null”。 “''+ foo.toString()''evalutes to”[Object object]“。当我重写toString()时,这个保持不变。因为在JSFiddle中,这工作得很好,我认为这是一些依赖性,解释器我很难想象,因为toString()在这个特定情况下似乎没有被调用 – 2013-04-27 02:38:59

+0

我会接受这个答案,因为它真的回答了这个问题:当使用字符串添加时,JavaScript对象如何转换为字符串? – 2013-04-27 02:45:04

+1

实际上认为使用调试器的想法很适合拍摄这种奇怪的截图:http://s8.postimg.org/ty5pxj3n9/null_string_conversion.png最新的Chrome和Firefox版本的行为都是相同的。 – 2013-04-27 10:27:10

1

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

在你的第二个例子,我怀疑的foo值为null - 我只是想不出该陈述console.log('' + foo)将打印null如果没有设置的foo价值null或者,作为Xymostech情况在评论中说,设置为字符串null

+0

没有冒犯性,但我甚至用粗体写了非null。该对象不是null! console.log(foo)!== console.log(''+ foo)。第一个让我检查对象,第二个打印null。请正确阅读该问题。 – 2013-04-27 01:43:39

+0

没有采取迈克尔,我读了这个问题。我无法想象如果foo不为null,语句console.log(''+ foo)将会打印null的情况。 – 2013-04-27 01:45:14

+0

好吧。那么,这正是我提出这个问题的原因。再举一个例子:console.log(''+(foo === null?'Oh noes,it's null!':foo));也打印null。这是我做的第一件事,但只有当foo是* not * null时才会发生。 – 2013-04-27 01:47:50

相关问题