Javascript 简单嵌套对象在Chrome控制台中生成“SyntaxError:意外标记”?

Javascript 简单嵌套对象在Chrome控制台中生成“SyntaxError:意外标记”?,javascript,Javascript,怎么会这样呢 {a:5,{b:{c:7}} 但是下面的所有表单都会产生语法错误:意外的标记“{” o={a:5,{b:{c:7}} console.log({a:5,{b:{c:7}}) ({a:5,{b:{c:7}}) varo={a:5,{b:{c:7}} varo={“a”:5,{“b”:{“c”:7}; 如果你看看这个{a:5,{b:{c:7}}}我们会发现它不是一个有效的javascript对象,因为一个对象应该有键值对 a:5可以,但是{b:{c:7}}没有键。它可以被解析

怎么会这样呢

{a:5,{b:{c:7}}
但是下面的所有表单都会产生语法错误:意外的标记“{”

o={a:5,{b:{c:7}}
console.log({a:5,{b:{c:7}})
({a:5,{b:{c:7}})
varo={a:5,{b:{c:7}}
varo={“a”:5,{“b”:{“c”:7};

如果你看看这个
{a:5,{b:{c:7}}}
我们会发现它不是一个有效的javascript对象,因为一个对象应该有键值对


a:5
可以,但是
{b:{c:7}}
没有键。

它可以被解析为不同的对象(控制台只打印第二个) 要修复:需要采用key:value格式 e、 g

{a:5}{a:5,b:4}{a:5,b:{a:4}
但是你有一个
{a:5,{b:{c:7}}
作为
key:value
对,第二个子对象
key

因此,您需要指定如下内容:

esprima.parse('1,2,3').body[0].expression  // { type: "SequenceExpression", expressions: [ ... ]}

esprima.parse('{a:5,{b:{c:7}}}').body[0].body[0].body.expression // also SequenceExpression
const o={a:5,d:{b:{c:7}}}
或者继续我上面的第二个例子:
const o={a:5,b:{c:7}

想象一下,试图在javascript函数中获取每个值会是什么样子

 const  o={a:5,d:{b:{c:7}}}  
o.a=5, o.d={b:{c:7}}, o.d.b={c:7}, o.d.b.c=7 

所有对象文字都有错误:

{
  a: 5,
//v--- a key is missing, so { is unexpected
     {
     b: {
       c: 7
    }
  }
}
因此,所有代码都应该抛出

然而,你的第一个没有

这是因为当JS解释器遇到
{
时,会立即猜测它是对象文字还是块语句。如果这两种情况都有可能,则它会假定为块语句

在这种情况下也会发生这种情况,如果你仔细观察,它是有效的:

|块语句|
||标签|数字|逗号运算符|对象文字||
{a:5,{b:{c:7}}

在控制台中键入以下内容:

'hello', 'world', 42
结果是42。你可以阅读更多关于这样的表达式

这个问题表明,您认为这是一个对象表达式,而事实并非如此

JavaScript解析器无法读取想法。打开和关闭大括号(
{
}
)不仅为对象文本标记开始和结束;它们也为函数体、if表达式体等标记开始和结束。当遇到一个大括号时,JavaScript解析器如何理解您的意思?从这里开始是什么?对象?函数体?if体
序列ce表达式(这些是我在开始时提到的)

有一些JavaScript解析器是用JavaScript(如或)编写的,当需要“像解析器一样思考”时,它们可以帮助新手和长期专业人士。无论是noob还是pro,我建议您使用esprima并尝试以下内容:

esprima.parse('1,2,3').body[0].expression  // { type: "SequenceExpression", expressions: [ ... ]}

esprima.parse('{a:5,{b:{c:7}}}').body[0].body[0].body.expression // also SequenceExpression
还是这个

esprima.parse('{}').body[0] // BlockStatement

esprima.parse('({})').body[0]  // ObjectExpression

使用esprima,你可以找到问题的根源,比如,为什么
({hi:'petard',lo:'biere'})['hi']
有效,但是
{hi:'petard',lo:'biere'}['hi']
没有,或者您提出的问题。

这些示例都不是有效的json字符串。请参阅它们的外观。@leiropi问题是关于Javascript的,而不是关于json。由于json是Javascript的一个不完整的子集,特别对对象键有进一步的限制,简单地说这不是有效的json实际上没有帮助ful或相关。这是相关的,因为在这些情况下,正确的Javascript语法等于这些对象的json表示。此外,您在问题中甚至没有提到Javascript。@leiropi根据该参数,您还可以编写一个虚构的语言规范,并链接到该规范,只要其“正确”语法在技术上也是有效的Javascript。忽略这一点,链接到一个多页技术规范来回答一个简单的打字错误引起的一句话问题仍然没有帮助。这个问题被清楚地标记为Javascript,它显示在问题正文和页面标题下,并明确提到“Chrome控制台”我的玻璃球告诉我你在
{a:5,b:{c:{d:7}}}
{a:5,b:{c:7}}之间被撕裂了
当你决定键入时仍然“站在铁轨上”。啊,好吧,我不知怎么错过了。哇,谢谢你指出了这一点。好奇,为什么提到JSON?我想你指的是JavaScript对象。不,它和JSON不一样。它有相同的“输入错误”JSON的问题并不令人惊讶,因为JSON更为严格。
JSON.parse({a:5,x:{b:{c:7}}}}')
可以工作(注意我插入了“x”),但是原始的
JSON.parse({a:5,{b:{c:7}}}}')
失败。您可以在这里添加“x”来验证JSON要做到原样,您需要重新构造数据。要使其成为键值对,您不需要只使用JSON语法在验证器中进行验证above@evolutionbox抱歉,刚才看到了,JSON是具有Javascript对象语法的文本基数据。一个有效的JSON将是一个有效的对象。也用另一个验证JSON我喜欢上面,可能会给你更多关于它是如何失效的信息我现在看到了问题对不起,控制台只是验证了第二部分,忽略了第一部分而没有抛出错误