js中奇怪的JSON解析行为,"意外的令牌:"

kar*_*nyj 35 javascript json

正如在这个jsfiddle中所展示的那样,如果你有一个JS文件并且在不使用它的情况下创建了一个JSON对象,它的行为会有所不同,具体取决于键(成员)是否用引号括起来.

有效代码:{ a: 1};
无效代码:{ "a": 1 };

您将得到的是一条错误消息(在Chrome中,与FF/IE不同,但语法仍然失败)

未捕获的SyntaxError:意外的令牌:

但是如果你以某种方式使用该对象,例如:alert({ "a": 1 });一切都好了.

为什么会这样?

Poi*_*nty 61

该声明:

{ a: 1 };
Run Code Online (Sandbox Code Playgroud)

不是一个对象常量.它是一个块语句,其中包含一个带标签的表达式.这是有效的.

这个:

{ "a": 1 };
Run Code Online (Sandbox Code Playgroud)

是语法错误,因为它只是不可解析.引用的"a"在块内部启动一个表达式语句,但是在字符串之后的下一个标记是冒号,并且没有表达式形式看起来像一个表达式后面跟一个冒号.

现在:

var x = { "a": 1 };
Run Code Online (Sandbox Code Playgroud)

因为"{"不被解释为块语句的开头而起作用.该语句以var,因此它是一个变量声明.在"="标记右侧的表达式中,"{"唯一可以表示的是对象文字的开头.同样,请注意:

({ "a": 1 });
Run Code Online (Sandbox Code Playgroud)

没问题是因为左括号使得解析器期望嵌套的子表达式,所以"{"再次明确地表示它是对象文字的开头.

  • javascript internals真的很棒:)谢谢 (5认同)