我有一个包含未知对象的json数据:
var x = {
"unknown1": 234,
"unknown2": 324
}
我可以将属性名称设为:
var prop1 = Object.keys(x)[0];
现在我想找到这个属性的值。我显然可以x[prop1]
,但我想做x.prop1
。我的问题是:
prop1
转换为表达式,以便我可以使用x.prop1
? eval
可以解决这个问题,那么在这种情况下eval如何以及为什么会产生安全问题?答案 0 :(得分:4)
有什么方法可以将prop1转换为表达式,以便我可以使用x.prop1?
您无法生成源代码并编译/评估它。
如果
eval
可以解决这个问题,那么在这种情况下eval如何以及为什么会产生安全问题?
是的,eval
(及其近亲new Function
)可以做到这一点。如果您eval
来自不受信任的来源,那么这只是一个安全问题。如果您相信prop1
的值不包含恶意内容,则可以使用eval("x." + prop1)
执行此操作。或new Function("x", "return x." + prop1)(x)
。
但是没有充分的理由。只需使用x[prop1]
即可。这是括号表示的含义。这是正常的做法,它不需要启动解析器和代码生成器,速度更快,而且您不必担心prop1
有恶意代码在里面。如果您使用eval
或new Function
,它的不是正常做法,它必须启动解析器和代码生成器,它会变慢,并且在你的脑海里,你有那种琐碎的关注。所以使用x[prop1]
。 : - )
答案 1 :(得分:0)
正如@mhodges在评论中所说,你可以添加一个新的属性。
但这样做似乎有点多余。
x.prop1 = x[Object.keys(x)[0]]