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

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如何以及为什么会在这种情况下产生安全问题

我有一个json数据,其中包含如下未知对象:

var x = {
  "unknown1": 234,
  "unknown2": 324
}
我可以通过以下方式获取属性名称:

var prop1 = Object.keys(x)[0];  
现在我想找到这个属性的值。我显然可以做
x[prop1]
,但我想做
x.prop1
。我的问题是:

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

如果不生成源代码并对其进行编译/评估,您就不能这样做

如果
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
没有作用域问题。