一尘不染

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

json

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

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

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

我们可以避免吗?


阅读 253

收藏
2020-07-27

共1个答案

一尘不染

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是正常的并且其完成值为空,则返回未定义的值。

2020-07-27