当前位置: 首页 > 面试题库 >

为什么解析json字符串时eval('('+ jsonString +')')的开引号和括号

方飞鸣
2023-03-14
问题内容

您能否告诉我这种特定语法结构的原因

 eval('(' + jsonString+ ')')

解析json文本时。克罗克福德说:“ 文本必须用括号括起来,以避免绊倒JavaScript语法 。”
在这里。那是什么意思?

我们可以避免吗?


问题答案:

Crockford所指的语法含糊之处在于,如果在 表达式
上下文中未找到一个开放的花括号,则该花括号将被识别为一个块,而不是一个对象文字的开头。

例如:

{"foo": "bar"} // SyntaxError

会给您一个语法错误,因为它将被解释为一个块,字符串字面量为“ foo”,并且意外使用了token :

另一方面,圆括号(正式称为分组运算符)只能计算表达式,因此我们不会有任何语法歧义,因为只能在
语句 上下文中使用块。

({"foo": "bar"})

编辑: @ el.pescado提出了一个有趣的问题:

您能解释为什么未定义eval(’{}’)吗?

ECMAScript描述了一种内部类型来解释语句的行为,称为完成规范类型。

于完成类型的值是的形式的三元组(type, value, target),其中type可以是normalbreakcontinuereturn,或throw

value可以是任何语言值或empty,也可以是任何target标识符或empty

空块(生产Block : {})显式返回以下完成:

Return (normal, empty, empty).

eval函数在执行代码后退出新创建的执行上下文,检查所评估代码的结果完成情况,在步骤7中,我们可以看到,undefined如果完成类型为normal且完成值为,则显式返回该值empty

7-如果result.type是正常的并且其完成值为空,则返回未定义的值。



 类似资料:
  • 问题内容: 我通常使用以下代码来解析JSON字符串: 当数据如下所示时,效果很好: 突然之间,当输入其他数据时,我遇到了问题。解析失败,并且在调试时,我发现该字符串如下所示: 显然,我得到双引号内的JSON字符串。2个简短的问题:1)这是否正常,并且JSONObject应该能够解析它吗?2)如果不是,建议的处理方式是什么? 问题答案: 这似乎是JSON生成中的错误。JSON实际上应该在此处引发解析

  • 本文向大家介绍为什么eval要添加括号呢?相关面试题,主要包含被问及为什么eval要添加括号呢?时的应答技巧和注意事项,需要的朋友参考一下 没太理解题意,方法的调用是要加括号的啊…… 如果题目问的是为什么会有 这种调用形式的话,那是因为js规定在间接调用(无调用者上下文)时,其编译的代码会默认执行在顶层作用域。 例: 所以永远只会返回全局对象(该表达式可以作为的polyfill,并且无法被污染)

  • 使用PHP,我如何解析一个JSON对象,该对象包含方括号中的数组,并由管道“|”分隔? 例如,我需要访问“数据”的第二个组件,在本例中是“英语”。假设长度是可变的,因此不能按字符位置进行切片。

  • 问题内容: 我已经知道(困难的方式)需要在JSON数据周围添加括号,如下所示: (至少在Firefox 3中)。 这是什么原因呢?我讨厌写代码而又不了解幕后花絮。 问题答案: 放在括号内实际上等效于 如果要在没有括号的情况下进行评估,则将对代码进行评估,并且如果其中确实有任何命名函数,则将对其进行定义,但不会返回。 举例来说,可以像创建函数一样调用函数: 将调用刚刚定义的函数。但是,以下内容不起作

  • 我在解析antlr4中的格式行列表时遇到了一个问题 但这是失败的第一个字符识别'*'本身,这使我困惑。 第1行:0不匹配的输入'*这是一个字符串',应为'*'

  • 问题内容: 我有些困惑,为什么我在PHP中看到一些代码,这些代码的字符串用单引号引起来,有时用双引号引起来。 我只是在.NET或C语言中知道,如果用单引号引起来,则意味着它是一个字符,而不是字符串。 问题答案: PHP字符串不仅可以通过 _两种_方式指定,还可以通过 四种 方式指定。 用单引号引起来的字符串几乎可以完全“按原样”显示事物。变量和大多数转义序列将不被解释。唯一的例外是,要显示文字单引