如何将字符串转换为对象属性?
How to convert string into object property?
我有一个 json 数据,其中包含这样的未知对象:
var x = {
"unknown1": 234,
"unknown2": 324
}
我可以获得如下属性名称:
var prop1 = Object.keys(x)[0];
现在我想求这个属性的值。我显然可以做到 x[prop1]
,但我想做到 x.prop1
。我的问题是:
- 有什么方法可以将
prop1
转换为表达式以便我可以使用 x.prop1
?
- 如果
eval
可以解决这个问题,那么在这种情况下 eval 如何以及为什么会产生安全问题?
What are ways to convert prop1 into an expression so that I could use x.prop1?
如果不生成源代码和 compiling/evaluating 就不能。
If eval
can solve this then how and why would eval create security problems in this case?
是的,eval
(及其近亲 new Function
)可以做到这一点。如果您 eval
ing 的内容来自不受信任的来源,这只是一个安全问题。如果您可以相信 prop1
的值不包含恶意内容,那么您可以使用 eval("x." + prop1)
来执行此操作。或者 new Function("x", "return x." + prop1)(x)
.
但是没有充分的理由。只需使用 x[prop1]
。这就是括号符号的用途。这是正常做法,它不需要启动解析器和代码生成器,速度更快,而且您不必担心 prop1
中有恶意代码。如果你使用 eval
或 new Function
,那是 不是 的正常做法,它必须启动解析器和代码生成器,速度较慢,而且你有那个小问题在你的脑海里。所以使用x[prop1]
。 :-)
正如@mhodges 在他的评论中所说,您可以添加一个新的 属性。
但这样做似乎是多余的。
x.prop1 = x[Object.keys(x)[0]]
我有一个 json 数据,其中包含这样的未知对象:
var x = {
"unknown1": 234,
"unknown2": 324
}
我可以获得如下属性名称:
var prop1 = Object.keys(x)[0];
现在我想求这个属性的值。我显然可以做到 x[prop1]
,但我想做到 x.prop1
。我的问题是:
- 有什么方法可以将
prop1
转换为表达式以便我可以使用x.prop1
? - 如果
eval
可以解决这个问题,那么在这种情况下 eval 如何以及为什么会产生安全问题?
What are ways to convert prop1 into an expression so that I could use x.prop1?
如果不生成源代码和 compiling/evaluating 就不能。
If
eval
can solve this then how and why would eval create security problems in this case?
是的,eval
(及其近亲 new Function
)可以做到这一点。如果您 eval
ing 的内容来自不受信任的来源,这只是一个安全问题。如果您可以相信 prop1
的值不包含恶意内容,那么您可以使用 eval("x." + prop1)
来执行此操作。或者 new Function("x", "return x." + prop1)(x)
.
但是没有充分的理由。只需使用 x[prop1]
。这就是括号符号的用途。这是正常做法,它不需要启动解析器和代码生成器,速度更快,而且您不必担心 prop1
中有恶意代码。如果你使用 eval
或 new Function
,那是 不是 的正常做法,它必须启动解析器和代码生成器,速度较慢,而且你有那个小问题在你的脑海里。所以使用x[prop1]
。 :-)
正如@mhodges 在他的评论中所说,您可以添加一个新的 属性。
但这样做似乎是多余的。
x.prop1 = x[Object.keys(x)[0]]