正如this jsfiddle中所示,如果你有一个JS文件而你没有使用它就创建了一个JSON对象,它的行为会有所不同,具体取决于键(成员)是否用引号括起来。
有效代码:{ a: 1};
代码无效:{ "a": 1 };
您将得到的是错误消息(在Chrome中,与FF / IE不同,但语法仍然失败)
Uncaught SyntaxError:意外的令牌:
但是如果你以某种方式使用该对象,例如:alert({ "a": 1 });
一切都还可以。
为什么会这样?
答案 0 :(得分:61)
声明:
{ a: 1 };
是不对象文字。它是一个块语句,其中包含一个带标签的表达式。这是有效的。
此:
{ "a": 1 };
是语法错误,因为它只是不可解析。引用的“a”在块内部启动一个表达式语句,但是然后字符串后面的下一个标记是冒号,并且没有表达式形式看起来像一个表达式后面跟一个冒号。
现在:
var x = { "a": 1 };
有效,因为“{”不被解释为块语句的开头。该语句以var
开头,因此它是一个变量声明。在“=”标记右侧的表达式中,“{”唯一可以表示的是对象文字的开头。同样,请注意:
({ "a": 1 });
没问题,因为左括号使解析器期望嵌套的子表达式,所以“{”再次明确表示它是对象文字的开头。
答案 1 :(得分:3)
我刚刚意识到,通过require
加载JSON并且文件名不在.json
结束时,我收到此错误。将文件重命名为bla.json
,它可以正常工作。
答案 2 :(得分:2)
当不需要jsonp
时,使用jsonp
进行jQuery AJAX调用时,可能会弹出此错误。如果正常情况json
$.ajax({
dataType: 'json', // try using json rather than json p
...
});