如 this jsfiddle 中所示, 如果你有一个 JS 文件并且你创建了一个 JSON 对象而不使用它,它的行为会有所不同,具体取决于键(成员)是否用引号括起来。
有效代码:{ a: 1};
无效代码:{ "a": 1 };
您将收到一条错误消息(在 Chrome 中,FF/IE 不同,但语法仍然失败)
Uncaught SyntaxError: Unexpected token :
但如果你以某种方式使用该对象,例如:alert({ "a": 1 });
一切都会再次正常。
为什么会这样?
最佳答案
声明:
{ a: 1 };
不是对象字面量。这是一个 block 语句,其中有一个标记表达式。有效。
这个:
{ "a": 1 };
是一个语法错误,因为它是不可解析的。带引号的“a”在 block 内开始一个表达式语句,但字符串后面的下一个标记是冒号,并且没有看起来像表达式后跟冒号的表达式形式。
现在:
var x = { "a": 1 };
有效,因为“{”不被解释为 block 语句的开始。该语句以 var
开头,因此它是一个变量声明。在“=”标记右侧的表达式中,“{”唯一可以表示的是对象字面量的开头。同样,请注意:
({ "a": 1 });
没问题,因为左括号使解析器期望嵌套子表达式,因此“{”再次明确表示它是对象文字的开头。
关于javascript - js 中奇怪的 JSON 解析行为, "Unexpected token :",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10080551/