如何将字符串转换为对象属性?

时间:2017-04-19 15:28:37

标签: javascript json eval

我有一个包含未知对象的json数据:

var x = {
  "unknown1": 234,
  "unknown2": 324
}

我可以将属性名称设为:

var prop1 = Object.keys(x)[0];  

现在我想找到这个属性的值。我显然可以x[prop1],但我想做x.prop1。我的问题是:

  • 有哪些方法可以将prop1转换为表达式,以便我可以使用x.prop1
  • 如果eval可以解决这个问题,那么在这种情况下eval如何以及为什么会产生安全问题?

2 个答案:

答案 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有恶意代码在里面。如果您使用evalnew Function,它的不是正常做法,它必须启动解析器和代码生成器,它会变慢,并且在你的脑海里,你有那种琐碎的关注。所以使用x[prop1]。 : - )

答案 1 :(得分:0)

正如@mhodges在评论中所说,你可以添加一个新的属性。

但这样做似乎有点多余。

x.prop1 = x[Object.keys(x)[0]]