当我向Chrome JavaScript控制台输入简单对象时,我得到如下输出:
>true
true
>1/3
0.3333333333333333
等等。
但是当我输入对象时会出现语法错误:
>{ a: 1, b: 2 }
SyntaxError: Unexpected token :
arguments: Array[1]
0: ":"
length: 1
__proto__: Array[0]
get message: function getter() { [native code] }
get stack: function getter() { [native code] }
set message: function setter() { [native code] }
set stack: function setter() { [native code] }
type: "unexpected_token"
__proto__: Error
虽然我确信这个表达式可以在初始化对象时正确使用,因为:
>obj = { a: 1, b: 2 }
Object
a: 1
b: 2
__proto__: Object
也许这是一个愚蠢的问题,但我真的想知道为什么会发生这种情况?
答案 0 :(得分:8)
因为您的语句被评估为block,而不是对象文字声明。
请注意,ExpressionStatement不能以左大括号开头,因为这可能会使其与Block不一致。此外,ExpressionStatement不能以function关键字开头,因为这可能使其与FunctionDeclaration不一致。
要将其评估为表达式,它必须是赋值的右侧,括在括号中或前面有运算符。 (!{a:1,b:2}
)
答案 1 :(得分:7)
答案 2 :(得分:4)
这是因为没有上下文的开头{
被解释为块的开头。您可以使用括号:
({ a: 1, b: 2 })
尽管如此,它只是一个执行块 - 就像在if
或for
之后可能找到的那样。所以你可以输入:
{alert("Hello!");}
Here's more about that.也阻止了一些返回值,这既令人敬畏又令人失望。
答案 3 :(得分:2)
因为{ a: 1, b: 2 }
不是要执行的有效表达式。 JavaScript看起来就像一个代码块,因为它以花括号开始和结束。
如果您尝试({ a: 1, b: 2 })
,它就会有用。
答案 4 :(得分:2)
因为您的语句被评估为块,而不是对象文字声明。
真正的乔希
如果您希望将其评估为对象,请写下:
> ({a : 1, b : 2})
Object
a: 1
b: 2
__proto__: Object
答案 5 :(得分:1)
请改为尝试:
({ "a" : 1, "b" : 2 })