在JavaScript中将字符串转换为变量名

在JavaScript中将字符串转换为变量名,javascript,variables,Javascript,Variables,我一直在寻找解决方案,但找不到任何有效的方法 我有一个名为onlyVideo的变量 “onlyVideo”字符串被传递到函数中。我想将函数中的变量onlyVideo设置为某物。我该怎么做 (函数中可以调用许多变量,因此我需要它动态工作,而不是硬编码的if语句。) 编辑:可能有更好的方法来做你想做的事情。在JavaScript冒险的早期,我问过这个问题。查看JavaScript对象是如何工作的 简单介绍: // create JavaScript object var obj = { "key1"

我一直在寻找解决方案,但找不到任何有效的方法

我有一个名为
onlyVideo
的变量

“onlyVideo”
字符串被传递到函数中。我想将函数中的变量
onlyVideo
设置为某物。我该怎么做

(函数中可以调用许多变量,因此我需要它动态工作,而不是硬编码的
if
语句。)

编辑:可能有更好的方法来做你想做的事情。在JavaScript冒险的早期,我问过这个问题。查看JavaScript对象是如何工作的

简单介绍:

// create JavaScript object
var obj = { "key1": 1 };

// assign - set "key2" to 2
obj.key2 = 2;

// read values
obj.key1 === 1;
obj.key2 === 2;

// read values with a string, same result as above
// but works with special characters and spaces
// and of course variables
obj["key1"] === 1;
obj["key2"] === 2;

// read with a variable
var key1Str = "key1";
obj[key1Str] === 1;

如果是全局变量,则
窗口[variableName]

或者在您的情况下,
window[“onlyVideo”]
应该可以做到这一点。

Javascript有一个
eval()
函数用于这种情况:

function (varString) {
  var myVar = eval(varString);
  // .....
}
编辑:对不起,我想我把问题略过得太快了。这只会让你得到你需要的变量

function SetTo5(varString) {
  var newValue = 5;
  eval(varString + " = " + newValue);
}
或者如果使用字符串:

function SetToString(varString) {
  var newValue = "string";
  eval(varString + " = " + "'" + newValue + "'");
}
但是我想有一种更合适的方式来完成你想要的东西?我不认为eval()是你真正想要使用的东西,除非有很好的理由


对邪恶的评价说不。此处的示例:

您可以将窗口对象作为关联数组进行访问,并进行设置

window["onlyVideo"] = "TEST";
document.write(onlyVideo);

就评估与全局变量解决方案而言

我认为两者都有优点,但这实际上是一种错误的二分法。 如果您对全局名称空间有偏见,只需创建一个临时名称空间&使用相同的技术

var tempNamespace = {};
var myString = "myVarProperty";

tempNamespace[myString] = 5;

非常确定您可以作为tempnespace.myVarProperty(现在是5)访问,从而避免使用窗口存储。(字符串也可以直接放在括号中)

只有在全局范围内定义变量时,窗口['variableName']方法才有效。正确答案是“重构”。如果您可以提供一个“对象”上下文,那么可能存在一个通用的解决方案,但是存在一些变量,没有全局函数可以根据变量的范围来解析这些变量

(function(){
    var findMe = 'no way';
})();

如果要访问对象的属性,必须从
窗口的范围开始,遍历对象的每个属性,直到找到所需的属性。假设
a.b.c
已在脚本中的其他地方定义,则可以使用以下命令:

var values = window;
var str = 'a.b.c'.values.split('.');

for(var i=0; i < str.length; i++)
    values = values[str[i]];
var值=窗口;
var str='a.b.c'.values.split('.');
对于(变量i=0;i

这将用于获取任何对象的属性,无论对象有多深。

可以这样做

(函数(X,Y){
//X是“类”的本地名称
//如果参数X为空,则Doo为默认值
变量X=(typeof X='string')?X:'Doo';
变量Y=(typeof Y='string')?Y:'doo';
//这是指上面定义的局部X
此[X]=函数(doo){
//对象变量
this.doo=doo | |‘doo it’;
}
//方法的原型继承
//由另一方定义
此[X]。原型[Y]=函数(){
把这个还给我;
};
//使X全球化
窗口[X]=此[X];
}('Dooa','Dooa');//把名字写在这里
//试验
doo=新的Dooa(“abc”);
doo2=新的Dooa(“def”);
console.log(doo.dooa());
console.log(doo2.dooa())您可以这样做

var name=“foo”;
var value=“Hello foos”;
评估(“变量”+name+“=”+value+“;”);

警报(foo)下面的代码可以很容易地引用JavaScript中的每个div和其他HTML元素。这段代码应该包含在标记的前面,这样就可以看到所有的HTML元素。它后面应该是JavaScript代码

// For each element with an id (example: 'MyDIV') in the body, create a variable
// for easy reference. An example is below.
var D=document;
var id={}; // All ID elements
var els=document.body.getElementsByTagName('*');
for (var i = 0; i < els.length; i++)
    {
    thisid = els[i].id;
    if (!thisid)
        continue;
    val=D.getElementById(thisid);
    id[thisid]=val;
    }

// Usage:
id.MyDIV.innerHTML="hello";
//对于主体中具有id(例如:“MyDIV”)的每个元素,创建一个变量
//供参考。下面是一个例子。
var D=文件;
变量id={};//所有ID元素
var els=document.body.getElementsByTagName('*');
对于(变量i=0;i
让我说清楚一点

function changeStringToVariable(variable, value){
window[variable]=value
}
changeStringToVariable("name", "john doe");
console.log(name);
//this outputs: john doe
let file="newFile";
changeStringToVariable(file, "text file");
console.log(newFile);
//this outputs: text file

你用这个干什么?您是否绝对确定需要将其设置为正常的局部变量,而对象(哈希)将无法工作?嗯。。。我仍然不太明白为什么在一个有数组的世界中要这样做。无论如何,你的一些代码和解释会有很大帮助。我想我们需要更多关于你的最终目标是什么的细节是的,我会使用这个,而不是使用窗口(它有一些警告)为什么一个
eval()
答案被否决删除,这一个是上档的吗?@goggin你应该用正则表达式测试这个参数,以确保它是一个有效的名称。只是在没有先检查的情况下评估论点是荒谬的不安全的。这是这个问题唯一现实的答案。仅仅因为它涉及到“Eeee-vil”评估,并不意味着它不那么真实。Javascript没有变量(例如php中的$$varname),因此这确实是唯一的答案。使用
window[varname]
会产生引入全局变量的副作用,这可能是不需要的@沙兹,我认为你没有给现代JS口译员足够的信任。它们的速度非常快,只要不是在1ms计时器或紧循环中完成,解析和执行简单的单行赋值操作不会增加任何人的CPU使用量。@ParamagneticCroissant是一位热衷于代码管理的人。那些只看重时间和金钱的人不会。即使不是全局的,你也可以通过
scope[property]
或者甚至
this[property]
@WojciechBednarski来访问它:不要混淆范围和上下文
这是上下文,它指向什么取决于函数的调用方式。在JS中,50%的时间
窗口
,除非启用严格模式且
变为
未定义
a
function changeStringToVariable(variable, value){
window[variable]=value
}
changeStringToVariable("name", "john doe");
console.log(name);
//this outputs: john doe
let file="newFile";
changeStringToVariable(file, "text file");
console.log(newFile);
//this outputs: text file