为什么JSON是JavaScript的子集?

时间:2015-11-04 19:47:33

标签: javascript json eslint

Wikipedia says JSON被设计为JavaScript的非严格子集,即添加允许使用某些Unicode字符。引用当前版本截至2015-11-05:

  

虽然JSON通常被认为是JavaScript和ECMAScript的子集,但它允许在JavaScript和ECMAScript字符串中非法的字符串中使用一些非转义字符。

但是..如果我在ESLint中粘贴维基百科页面中的任何示例,则会失败并显示错误。

例如我粘贴它:

{
  "id": 1,
  "name": "Foo"
}

进入http://eslint.org/demo/并获取:

  

2:8 - 解析错误:意外的令牌:(未定义)

由于某种原因,在JavaScript中看起来冒号是非法的,而不是字符串中未转义的字符。

为什么人们仍然将JSON称为JavaScript子集?

4 个答案:

答案 0 :(得分:6)

JSON是JavaScript object 表示法的子集。你不能只是无处声明一个物体。

该对象的JavaScript用法是将其分配给变量:

var o = {
  "id": 1,
  "name": "Foo"
};

或将其传递给函数:

console.dir( {"id": 1, "name": "Foo" } );

答案 1 :(得分:2)

您遇到了一个常见的问题:松散的对象文字被解释为一个块,而不是一个对象。

如果您将var foo =添加到开头,则完全有效:

var foo = {
  "id": 1,
  "name": "Foo"
}

如果没有var foo声明和初始化变量,解析器会看到一个块(如if (true) { ... })和字符串文字("id")。松散的字符串文字后冒号是不合法的,因为在任何地方都不是真正的JS:

"id": foo(); // doesn't make sense

在对象文字中更常见的是不带引号的属性,解析器将其解释为命名标签(与goto一起使用的很少使用的foo:语法)。构造

{
  id: 1,
  name: "Foo"
}

看起来像一个带有标签id(指向表达式1),逗号运算符和另一个标签的块。同样,这没有多大意义,但第一部分至少是法律解析。

因为您已经遵循了JSON规范而不是JS对象文字并引用了您的属性名称,所以它将它们作为字符串文字进行选取,并且无法从中找出要做的事情。< / p>

有趣的是,如果你要使用:

{
  "id".toString(),
  "name".substr(1)
}
然后ESlint没有抱怨。它很奇怪而且不是很有用,但却是一种完全合法的语言结构。

答案 2 :(得分:1)

JSON是一个子集,因为它仅用于数据。 JavaScript允许定义函数和执行语句。 JSON只允许定义数据。这就是为什么它是一个子集。

您尝试将JSON验证为JavaScript 语句时收到的错误是您的数据不是语句。将其转换为语句,以便在eslint上看不到错误:

var foo = {
    "id": 1,
    "name": "Foo"
    };

答案 3 :(得分:1)

问题是解析器无法弄清楚它是对象上下文。你可以将它包装在():

({
    "id": 1,
    "name": "Foo"
})

它会做你期望的。