Javascript:如何使用eval返回或解析对象字面值?
问题描述:
我有一个小型的库,它接受字符串并构造它们之外的对象。例如,'-key val'
创建了{"key": "val"}
。然而,我试图扩展输入字符串的语法以获取简单的对象文字,例如'-key "{key: 'val'}"'
,它应该产生{"key" : {"key" : "val"}}
但是结果只有{"key" : "val"}
。Javascript:如何使用eval返回或解析对象字面值?
为什么eval只返回“val”而不是整个对象?那么我的解决方案是否有更安全的选择?
// my code before the fix
var arg = '{key: "val"}'
var result = eval(arg)
// result is "val"
下面是我的修复,这是非常不安全的!
const fmt = require('util').format
var arg = '{key: "val"}'
var result = eval(fmt('()=>(%s)', arg))()
// result is { key : "val" }
答
{key: "val"}
是块,key:
是标签。
如果您想将其解析为对象初始值设定项,请在需要表达式的位置使用它,例如,
({key: "val"})
0,{key: "val"}
[{key: "val"}][0]
答
var arg = '{key: "val"}' var result = eval(arg)
时的eval解析它,在 '{' 将被认为是代码块,并key:
是一个标签 所以我认为你应该使用var arg = '{key:"val"}' var result = eval('('+arg+')') //result {key:"val"}
的'{}'被视为一个块,'key'作为标签,所以这个评估为'“val”'。要将其评估为对象文字,您需要将其包装在括号中。这基本上就是你的修补程序所做的,尽管是以一种复杂的方式。相反,只要执行'eval('('+ arg +')')'。 – 2016-07-22 03:02:14