Javascript 添加数组和对象时JS控制台不一致

Javascript 添加数组和对象时JS控制台不一致,javascript,Javascript,我不想问为什么[]+[]会给你空字符串,等等,因为我们无法更改它。原因只是语言的设计 我的问题是关于Chrome和FF Firebug JS控制台中注意到的以下不一致性: {} + []; // outputs 0 console.log({} + []); // outputs [object Object] var c = {} + []; console.log(c); // outputs [object Object] 我知道这个表达式返回一个值,这就是您在控制台输出中看到的。但是,

我不想问为什么[]+[]会给你空字符串,等等,因为我们无法更改它。原因只是语言的设计

我的问题是关于Chrome和FF Firebug JS控制台中注意到的以下不一致性:

{} + []; // outputs 0
console.log({} + []); // outputs [object Object]
var c = {} + [];
console.log(c); // outputs [object Object]
我知道这个表达式返回一个值,这就是您在控制台输出中看到的。但是,当使用console.log将此返回值分配给变量或输出时,为什么会更改

这是否意味着提到的控制台有问题


有没有更好的解释来说明这就是它的实现方式?

在第一个示例中,它只是一个块,因此相当于运行此代码。数组文本前面的加号将其转换为数字:

{};
+[]; // 0
但是,在您的console.log代码中,它被视为一个表达式,因此它实际上是一个对象文本。您只能将表达式传递给函数,因此这是相同的

function a(b) {return b;}
a({}+[]); // "[object Object]"

加法操作将它们转换为字符串,这就是得到[object object]的原因。

在第一个示例中,它只是一个块,因此相当于运行此代码。数组文本前面的加号将其转换为数字:

{};
+[]; // 0
但是,在您的console.log代码中,它被视为一个表达式,因此它实际上是一个对象文本。您只能将表达式传递给函数,因此这是相同的

function a(b) {return b;}
a({}+[]); // "[object Object]"
加法操作将它们转换为字符串,因此您可以得到[object object]。

它与console.log无关

在{}+[]中,{}被解析为块,而在后两种情况下,它被解析为作为表达式一部分的对象

无论是否为console.log,var a={}+[]都会将a设置为对象,这一点很明显

通过简单地添加括号(使其成为表达式),可以进一步简化后两种情况:

({} + [])  //=> "[object Object]"
它与console.log无关

在{}+[]中,{}被解析为块,而在后两种情况下,它被解析为作为表达式一部分的对象

无论是否为console.log,var a={}+[]都会将a设置为对象,这一点很明显

通过简单地添加括号(使其成为表达式),可以进一步简化后两种情况:

({} + [])  //=> "[object Object]"

为什么不删除每个地方都给出相同输出的情况?这只是杂乱无章。可能是@Bergi的复制品你是对的-他们触及的是同一个问题。谢谢你发布这个链接!为什么不删除每个地方都给出相同输出的情况?这只是杂乱无章。可能是@Bergi的复制品你是对的-他们触及的是同一个问题。谢谢你发布这个链接!这段代码最让我信服:{}+[]。这确实是一个街区。谢谢这段代码最让我信服:{}+[]。这确实是一个街区。谢谢用一个简单的分组运算符代替该标识函数就足够了:{}+[]-@Bergi:这是为了证明这一点,当向函数传递参数时,它们是作为表达式传递的——就像console.log示例一样-@Bergi:这是为了证明在向函数传递参数时,它们是作为表达式传递的,就像console.log示例一样。