36

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

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

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

Uncaught SyntaxError: Unexpected token :

但是如果您以某种方式使用该对象,例如:alert({ "a": 1 });一切正常。

为什么会这样?

4

3 回答 3

62

该声明:

{ a: 1 };

不是对象文字。这是一个块语句,其中有一个标记表达式。这是有效的。

这:

{ "a": 1 };

是一个语法错误,因为它只是不可解析。带引号的“a”在块内开始一个表达式语句,但字符串后面的下一个标记是一个冒号,并且没有看起来像一个表达式后跟一个冒号的表达式形式。

现在:

var x = { "a": 1 };

有效,因为“{”不被解释为块语句的开始。该语句以 开头var,因此它是一个变量声明。在“=”标记右侧的表达式中,“{”唯一可以表示的是对象字面量的开头。同样,请注意:

({ "a": 1 });

没关系,因为左括号使解析器期望嵌套子表达式,因此“{”再次明确表示它是对象文字的开头。

于 2012-04-09T22:15:32.993 回答
3

我刚刚意识到,当我通过加载 JSONrequire并且文件名没有结束时,.json我得到了这个错误。将文件重命名为bla.json,它工作正常。

于 2016-07-30T22:18:35.590 回答
2

jsonp在不需要时使用 jQuery AJAX 调用时会弹出此错误jsonp。如果是正常情况,请尝试在 AJAX 调用中切换数据类型json

$.ajax({
     dataType: 'json', // try using json rather than json p
     ...
});
于 2015-10-09T00:21:31.473 回答