为什么JSON是JavaScript的子集?
JSON被设计为JavaScript的非严格子集,即允许使用一些Unicode字符。引用截至2015年11月5日的当前版本: 虽然JSON通常被认为是JavaScript和ECMAScript的子集,但它允许在字符串中使用一些在JavaScript和ECMAScript字符串中非法的未转义字符 但是。。如果我将Wikipedia页面中的任何示例粘贴到ESLint中,它将失败并出错 例如,我粘贴以下内容:为什么JSON是JavaScript的子集?,javascript,json,eslint,Javascript,Json,Eslint,JSON被设计为JavaScript的非严格子集,即允许使用一些Unicode字符。引用截至2015年11月5日的当前版本: 虽然JSON通常被认为是JavaScript和ECMAScript的子集,但它允许在字符串中使用一些在JavaScript和ECMAScript字符串中非法的未转义字符 但是。。如果我将Wikipedia页面中的任何示例粘贴到ESLint中,它将失败并出错 例如,我粘贴以下内容: { "id": 1, "name": "Foo" } 进入并获取: 2:8-分析错
{
"id": 1,
"name": "Foo"
}
进入并获取:
2:8-分析错误:意外标记:(未定义)
由于某种原因,冒号在JavaScript中似乎是非法的,它与字符串中未替换的字符无关
为什么人们仍然将JSON称为JavaScript子集?JSON是一个子集,因为它仅用于数据。JavaScript允许定义函数和执行语句。JSON只允许定义数据。这就是为什么它是一个子集 尝试将JSON验证为JavaScript语句时收到的错误是,您的数据不是语句。将其转换为语句以不在eslint上看到错误:
var foo = {
"id": 1,
"name": "Foo"
};
JSON是一个子集,因为它仅用于数据。JavaScript允许定义函数和执行语句。JSON只允许定义数据。这就是为什么它是一个子集 尝试将JSON验证为JavaScript语句时收到的错误是,您的数据不是语句。将其转换为语句以不在eslint上看到错误:
var foo = {
"id": 1,
"name": "Foo"
};
您遇到了一个比较常见的问题:松散对象文字被解释为块,而不是对象 如果将
var foo=
添加到开头,则它完全有效:
var foo = {
"id": 1,
"name": "Foo"
}
如果没有var foo
来声明和初始化变量,解析器将看到一个块(如if(true){…}
)和字符串文本(“id”
)。冒号在松散字符串文字后是不合法的,因为它不是真实的:
"id": foo(); // doesn't make sense
这在对象文本中的不带引号的属性中更常见,解析器将其解释为命名标签(用于goto的很少使用的foo:
语法)。构造
{
id: 1,
name: "Foo"
}
看起来像一个带有标签id
(指向表达式1
)、逗号运算符和另一个标签的块。同样,这没有多大意义,但第一部分至少是一个法律解析
因为您遵循的是JSON规范,而不是JS对象文本,并引用了您的属性名,所以它将它们作为字符串文本进行提取,并且无法从中找出要做的事情
有趣的是,如果你要使用:
{
"id".toString(),
"name".substr(1)
}
那么埃斯林特没有抱怨。这很奇怪,也不是很有用,但却是一个完全合法的语言构造。您遇到了一个比较常见的问题:松散的对象文字被解释为块,而不是对象 如果将
var foo=
添加到开头,则它完全有效:
var foo = {
"id": 1,
"name": "Foo"
}
如果没有var foo
来声明和初始化变量,解析器将看到一个块(如if(true){…}
)和字符串文本(“id”
)。冒号在松散字符串文字后是不合法的,因为它不是真实的:
"id": foo(); // doesn't make sense
这在对象文本中的不带引号的属性中更常见,解析器将其解释为命名标签(用于goto的很少使用的foo:
语法)。构造
{
id: 1,
name: "Foo"
}
看起来像一个带有标签id
(指向表达式1
)、逗号运算符和另一个标签的块。同样,这没有多大意义,但第一部分至少是一个法律解析
因为您遵循的是JSON规范,而不是JS对象文本,并引用了您的属性名,所以它将它们作为字符串文本进行提取,并且无法从中找出要做的事情
有趣的是,如果你要使用:
{
"id".toString(),
"name".substr(1)
}
那么埃斯林特没有抱怨。它很奇怪,也不是很有用,但却是一种完全合法的语言构造。JSON是JavaScript对象表示法的子集。你不能凭空声明一个对象 该对象的JavaScript用法是将其分配给一个变量:
var o = {
"id": 1,
"name": "Foo"
};
或者将其传递给函数:
console.dir( {"id": 1, "name": "Foo" } );
等等。JSON是JavaScript对象表示法的子集。你不能凭空声明一个对象 该对象的JavaScript用法是将其分配给一个变量:
var o = {
"id": 1,
"name": "Foo"
};
或者将其传递给函数:
console.dir( {"id": 1, "name": "Foo" } );
等等。问题是解析器还不能确定它是对象上下文。您可以将其包装为():
它将实现您所期望的功能。问题在于解析器还不能确定它是对象上下文。您可以将其包装为():
它将实现您所期望的功能。您的JSON是一个无效的EcmaScript,但却是一个有效的JSON。与其说是冒号,不如说是一个意外出现的对象。尝试使用前缀为
var x=
的代码。(这会给你另一个错误,但语法上没有问题。)试试var obj={“id”:1,“name”:“Foo”}
就像var x=1
是JS一样,它并不意味着它在任何地方都可以工作,比如var y=var x=2
你的JSON是一个无效的EcmaScript,但却是一个有效的JSON。与其说冒号,不如说是一个意外出现的对象。尝试使用前缀为var x=
的代码。(这会给你一个其他的错误,但是语法上没有问题。)试试var obj={“id”:1,“name”:“Foo”}
就像var x=1
是JS一样,它并不意味着它在任何地方都可以工作,比如var y=var x=2
上面没有方法,JSON需要带引号的键,不能编码日期对象或RegExp,甚至不能使用对象引用;只有原语和文本。上述没有方法,JSON需要带引号的键,不能编码日期对象或RegExp,甚至不能使用对象引用;只有原语和文字。