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子集?
答案 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"
})
它会做你期望的。