Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JSON是JavaScript的子集?_Javascript_Json_Eslint - Fatal编程技术网

为什么JSON是JavaScript的子集?

为什么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-分析错

JSON被设计为JavaScript的非严格子集,即允许使用一些Unicode字符。引用截至2015年11月5日的当前版本:

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

但是。。如果我将Wikipedia页面中的任何示例粘贴到ESLint中,它将失败并出错

例如,我粘贴以下内容:

{
  "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,甚至不能使用对象引用;只有原语和文字。