JavaScript对象字面量符号混淆

7
在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"]

有人可以帮忙解释一下为什么有区别吗?谢谢!

1
https://dev59.com/u3I_5IYBdhLWcg3wJPdu#1509664 是一个看似不相关的问题,但对于你可能遇到的一个问题有一个相关的答案。 - Crescent Fresh
2个回答

6

这是由于语法不明确造成的。当您在前两行尝试创建一个普通的对象文字时,JavaScript实际上将其解释为一组大括号,然后是一个标签,再然后是一个语句:

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

这段代码并不会被求值为一个对象,只是一个数组。在第一个例子中,您试图使用字符串作为标签,这是不正确的语法。第三个例子可以正常工作,创建一个对象并将其存储在a中。


4
为了将其作为表达式(对象字面量)而不是标签后跟数组字面量周围的大括号,您必须将其用作右侧值(如您最后一个示例中所示)。作为右侧值,这三个都将是有效的对象字面量表示法(使用 d:、使用 "d": 和使用 'd': 的表示法)。有点偏题,但只有使用 "d": 的表示法才是有效的 JSON,如果与您的工作相关,则这一点很重要,因为 JSON 是对象字面量表示法的子集。(http://json.org) - T.J. Crowder
为什么他们要在Javascript中加入GOTO语句呢... 叹气 - Matt Ball
1
@Bears:他们没有,Javascript 没有 goto 语句。它有标签,这对于 break 退出内部循环等非常有用。(请参见第五版规范的第12.12节。在早期规范中,goto 是一个保留符号,但没有 goto 语句——例如,他们在保险。从第五版开始,不再保留。) - T.J. Crowder
3
@Oscar:第二个例子不起作用。它没有生成对象字面量,只是有效的语法用于评估带有标签和数组表达式的块。 - Claudiu

4

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

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

阅读命名函数表达式揭秘。虽然它与此问题无直接关系,但在谈论分组括号和eval()的使用时确实涉及到了此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接