2012-10-07 58 views
2

我在测试时看到控制台(Chrome)的行为。如果我键入console.log({key:'value'})正在打印Object {key: "value"}这是我所期望的。但是当我在控制台直接输入{key:'value'}时,它仅在我期望Object {key: "value"}时打印'value'为什么{key:'value'}在控制台上打印“值”

在IE10和FF中看到了相同的行为。 这种行为背后的原因是什么?

回答

5

这是因为你的对象被解释为一个块语句,其中包含一个由一个标签前面的字符串文本组成的单个语句。

// v---block----v 
    {key: "value"} 
// ^--label 

要让控制台将其解释为对象字面值语法,它需要成为表达式的一部分。如果你裹着包袱,你会得到预期的结果。

({key:"value"}) 

旁注:

这里是真正怪异的一部分。一个声明是一个声明,因为它不返回什么。那为什么它会返回"value"

在JavaScript中,语句具有类似于最终值的内容。 (我不记得它叫做什么。)程序代码中没有任何有用或可达的东西,但是当一个程序被评估时,最终值将被返回给任何评估它的东西。

当您使用eval()评估程序时也是如此。其最终声明价值将被退回。由于控制台中的代码是eval'd,它会获取最终值并打印出来。

+0

我认为你是对的,它被解释为JavaScript标签。 – Anoop

+0

@Shusl:是的,这与您尝试“返回”对象文字的问题非常相似。如果你有这样的结果:'return {foo:“bar”};',而不是在'return'的同一行上放上'{',你在下一行放置它,解释器放一个';'在'return'之后,因为它将'{foo:“bar”}'视为一个单独的块语句。 –

1

这是因为你输入的内容是被解释的。

{key:'value'}是一个块并返回“值”。你只能用key:'value''value'得到相同的结果。

如果您想要一个表达式返回对象,请键入({key:'value'})

相关问题