Javascript 如何将字符串转换为对象属性?
我有一个json数据,其中包含如下未知对象:Javascript 如何将字符串转换为对象属性?,javascript,json,eval,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如何以及为什么会在这种情况下产生安全问题
var x = {
"unknown1": 234,
"unknown2": 324
}
我可以通过以下方式获取属性名称:
var prop1 = Object.keys(x)[0];
现在我想找到这个属性的值。我显然可以做x[prop1]
,但我想做x.prop1
。我的问题是:
- 有什么方法可以将
转换为表达式,以便我可以使用prop1
李>x.prop1
- 如果
可以解决这个问题,那么eval如何以及为什么会在这种情况下产生安全问题eval
eval
可以解决这个问题,那么eval如何以及为什么会在这种情况下产生安全问题
是的,eval
(以及它的近亲新功能
)可以做到这一点。只有当您的eval
ing来自不受信任的来源时,这才是一个安全问题。如果您可以相信prop1
的值不包含恶意内容,那么您可以使用eval(“x.”+prop1)
来执行此操作。或新函数(“x”,“返回x.”+prop1)(x)
但是没有充分的理由这样做。只需使用x[prop1]
。这就是括号符号的作用。这是正常的做法,它不必启动解析器和代码生成器,速度更快,而且您不必担心prop1
中有恶意代码。如果您使用eval
或新函数
,则不是正常的做法,它必须启动解析器和代码生成器,速度较慢,而且您的脑海中会有这种琐碎的顾虑。所以使用x[prop1]
:-)
有什么方法可以将prop1转换为表达式,以便使用x.prop1
如果不生成源代码并对其进行编译/评估,您就不能这样做
如果eval
可以解决这个问题,那么eval如何以及为什么会在这种情况下产生安全问题
是的,eval
(以及它的近亲新功能
)可以做到这一点。只有当您的eval
ing来自不受信任的来源时,这才是一个安全问题。如果您可以相信prop1
的值不包含恶意内容,那么您可以使用eval(“x.”+prop1)
来执行此操作。或新函数(“x”,“返回x.”+prop1)(x)
但是没有充分的理由这样做。只需使用
x[prop1]
。这就是括号符号的作用。这是正常的做法,它不必启动解析器和代码生成器,速度更快,而且您不必担心prop1
中有恶意代码。如果您使用eval
或新函数
,则不是正常的做法,它必须启动解析器和代码生成器,速度较慢,而且您的脑海中会有这种琐碎的顾虑。所以使用x[prop1]
:-) 正如@mhodges在他的评论中所说,你可以添加一个新的属性
但这样做似乎是多余的
x.prop1 = x[Object.keys(x)[0]]
正如@mhodges在他的评论中所说,你可以添加一个新的属性 但这样做似乎是多余的
x.prop1 = x[Object.keys(x)[0]]
根据点语法的性质,
x.prop1
将始终为您提供x对象上的文字属性“prop1”。因此,除非您将新属性称为“prop1”,否则您别无选择,只能使用括号语法。作为跟进:我真的很好奇您为什么不想使用括号语法?“我显然可以做x[prop1]”—您应该—“但我想做x.prop1”—不要再想了。这是一个错误的作业工具。不想在作业中使用权限的原因是什么?我不确定这意味着什么。好吧,根据点语法的性质,x.prop1
将始终为您提供x对象上的文字属性“prop1”。因此,除非您将新属性称为“prop1”,否则您别无选择,只能使用括号语法。作为跟进:我真的很好奇您为什么不想使用括号语法?“我显然可以做x[prop1]”—您应该—“但我想做x.prop1”—不要再想了。这是一个错误的工作工具。不想使用权限来完成工作的原因是什么?我不确定这意味着什么。虽然不是安全问题,eval
速度很慢,可以在范围内做奇怪的事情。@Quentin:速度较慢,当然;在这个时代它并不慢。“x.”+prop1
没有范围问题。但正如我所知,我们同意,没有充分的理由使用eval
(或newfunction
)来做括号符号已经做过的事情…:-)@T.J.Crowder我甚至不确定我是否会告诉OP这是可能的,lol.@user31782:eval(x.prop1)
的意思是“从x
中获取名为prop1
(字面意思)的属性的值,将该值传递到eval
,并将其作为代码进行计算。因此它将计算x.prop1
中存储在字符串中的任何代码。”(其中prop1
字面上是属性名)。eval(“x.prop1”)
执行x.prop1
而不执行eval
的操作:从x
获取名为prop1
(字面上)的属性值(但速度较慢,需要启动解析器和代码生成器)@user31782:从问题和评论来看,听起来你是一个相当新的JavaScript程序员。我的建议是:忘记所有eval
和new Function
。假装它们不存在。适合它们的实际用例数量非常少,通常在相当先进的系统环境中。直到/unl如果你正在开发这样的东西,就不要使用它们。改用普通的JavaScript习惯用法,比如x[prop1]
。快乐的编码!虽然没有安全问题,eval
速度很慢,可以在作用域上做一些奇怪的事情。@Quentin:当然,它比较慢;在当今这个时代并不慢。“x”+prop1
没有作用域问题。