JavaScript的eval和对象求值

14

我有一个调试框架的一部分需要运行时评估对象。

具体来说,如果我有一个像这样的字符串 "{a: 1, b:2}" ,它需要将其评估为具有成员 ab 以及相应值的对象。但是,如果我执行 eval("{a: 1, b:2}") ,它似乎将其评估为语句,并显示关于非法标签的内容。

我已经进行了一些修改,使其以以下方式进行评估:

eval("var x=" + str + "; x;");

这种方法似乎可行,但看起来像是一个可怕的hack。有没有更好的建议?

(顺便说一句,我知道eval的危险性,但这是调试框架的一部分,实际用户不会看到它。)


3
查看:https://dev59.com/j3A75IYBdhLWcg3wUHSQ当解析 JSON 时,为什么要使用 eval('(' + jsonString + ')') 中的开引号和括号? - Christian C. Salvadó
1个回答

32

您可以使用()来使其解析为对象而不是语句,像这样:

eval("(" + str + ")");

不过,如果浏览器支持的话,你应该首先使用 JSON.parse()


2
JSON.parse() 无法处理所描述的示例,因为它们不是有效的 JSON。例如,有效的 JSON 将所有属性名称用双引号括起来。 - PleaseStand
1
@idealmachine - 是的,你说得对...但同时,我认为如果你打算这样使用它,为什么不一开始就使用有效的JSON呢?在这个例子中,是的,用户需要调整他们的对象标记。 - Nick Craver
编写一个函数,将JavaScript对象表示法转换为JSON(例如添加引号)。这很容易实现。 - cdiggins
有人明白这是为什么吗? - commonpike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接