JavaScript对象字面符号混淆

时间:2010-05-05 16:37:03

标签: javascript json

在Firefox控制台中,此代码将生成错误:

{"d" : ["bankaccountnumber", "$1234.56"] } 
>   SyntaxError: invalid label {
> message="invalid label",  more...}

此代码工作得很好

{d : ["bankaccountnumber", "$1234.56"] } 
> ["bankaccountnumber", "$1234.56"]

此代码也可以正常工作

var a = {'d' : ["bankaccountnumber", "$1234.56"] };
a.d
> ["bankaccountnumber", "$1234.56"]

有人可以帮助解释为什么会有差异吗?谢谢!

2 个答案:

答案 0 :(得分:6)

这是因为语法含糊不清。当你尝试在前两行中创建一个普通的对象文字时,JavaScript实际上将它解释为一组大括号,然后是一个标签,然后是一个语句:

{
    d: ["bankaccountnumber", "$1234.56"]
}

此代码不会评估对象,而只评估数组。第一个示例,您尝试使用字符串作为标签,这是不正确的语法。第三个示例正常工作,创建一个对象并将其存储在a

答案 1 :(得分:4)

可能很难确定它是表达式还是块。如果在对象周围使用括号,它会强制表达式。分组运算符()强制{}被解析为对象文字。

({"d" : ["bankaccountnumber", "$1234.56"] }) // works

阅读Named function expressions demystified。它与此问题没有直接关系,但在讨论使用分组括号和eval()时确实解决了这个问题。