在JavaScript中使用动态变量名称

时间:2011-02-25 12:19:27

标签: javascript dynamic-variables

在PHP中,你可以做出如下惊人/可怕的事情:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1

有没有办法用Javascript做这样的事情?

E.g。如果我有var name = 'the name of the variable';,我可以获得名称为name的变量的引用吗?

17 个答案:

答案 0 :(得分:316)

由于ECMA- / Javascript全部是关于ObjectsContexts(也是某些对象的),所以每个变量都存储在一个名为变量 - (或者在功能的情况下,激活对象)。

所以如果你创建这样的变量:

var a = 1,
    b = 2,
    c = 3;

全局范围(= NO函数上下文)中,您隐式将这些变量写入全局对象(= window在浏览器中)。< / p>

可以使用“点”或“括号”表示法访问这些:

var name = window.a;

var name = window['a'];

这仅适用于此特定实例中的全局对象,因为全局对象变量对象window对象本身。在函数的上下文中,您无法直接访问激活对象。例如:

function foobar() {
   this.a = 1;
   this.b = 2;

   var name = window['a']; // === undefined
   alert(name);
   name = this['a']; // === 1
   alert(name);
}

new foobar();

new创建自定义对象(context)的新实例。如果没有new,函数的范围也将是global(= window)。此示例将分别提醒undefined1。如果我们将this.a = 1; this.b = 2替换为:

var a = 1,
    b = 2;

两个警报输出都是未定义的。在这种情况下,变量ab将存储在我们无法访问的foobar的激活对象中(当然,我们可以通过调用a直接访问这些变量和b)。

答案 1 :(得分:141)

eval是一种选择。

var a = 1;
var name = 'a';

document.write(eval(name)); // 1

答案 2 :(得分:70)

您可以使用窗口对象来获取它。

window['myVar']

window引用了您正在使用的所有全局变量和全局函数。

答案 3 :(得分:35)

只是不知道什么是错误的答案获得如此多的选票。这很容易回答,但你把它变得复杂。

// If you want to get article_count
// var article_count = 1000;
var type = 'article';
this[type+'_count'] = 1000;  // in a function we use "this";
alert(article_count);

答案 4 :(得分:27)

a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);

试试这个......

答案 5 :(得分:23)

这是一个例子:

for(var i=0; i<=3; i++) {
    window['p'+i] = "hello " + i;
}

alert(p0); // hello 0
alert(p1); // hello 1
alert(p2); // hello 2
alert(p3); // hello 3

另一个例子:

var myVariable = 'coco';
window[myVariable] = 'riko';

alert(coco); // display : riko

所以,价值&#34; coco &#34; myVariable 成为变量 coco

因为全局范围内的所有变量都是Window对象的属性。

答案 6 :(得分:12)

在Javascript中,您可以使用所有属性都是键值对的事实。 jAndy已经提到了这一点,但我不认为他的答案显示了如何利用它。

通常,您不是要创建一个变量来保存变量名,而是尝试生成变量名然后再使用它们。 PHP使用$$var表示法,但Javascript并不需要,因为属性键可以与数组键互换。

var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);

给出了123.通常你想构造变量,这就是为什么存在间接,所以你也可以反过来这样做。

var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);

答案 7 :(得分:4)

如果您不想使用像窗口或全局(节点)这样的全局对象,可以尝试这样的事情:

var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';

console.log(obj['whatever']);

答案 8 :(得分:2)

我需要动态绘制多个FormData并且对象方式运行良好

var forms = {}

然后在我的循环中,我需要创建一个使用的表单数据

forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);

答案 9 :(得分:2)

2019

TL; DR

  • eval运算符可以在其调用的上下文中运行字符串表达式,并从该上下文返回变量;
  • 理论上,
  • literal object可以通过写:{[varName]}来做到这一点,但是它被定义阻塞了。

所以我遇到了这个问题,这里的每个人都在玩耍而没有提出真正的解决方案。但是@Axel Heider的接洽很好。

解决方案是eval。 几乎是最被遗忘的运营商。 (认为​​大多数是with()

eval运算符可以在其调用的上下文中动态运行表达式。并返回该表达式的结果。我们可以使用它在函数的上下文中动态返回变量的值。

示例:

function exmaple1(){
   var a = 1, b = 2, default = 3;
   var name = 'a';
   return eval(name)
}

example1() // return 1


function example2(option){
  var a = 1, b = 2, defaultValue = 3;

  switch(option){
    case 'a': name = 'a'; break;
    case 'b': name = 'b'; break;
    default: name = 'defaultValue';
  }
  return eval (name);
}

example2('a') // return 1
example2('b') // return 2
example2() // return 3

请注意,我总是明确地编写表达式eval将运行。 为了避免代码中出现不必要的意外。 eval很强 但是我确定你已经知道了

顺便说一句,如果合法,我们可以使用literal object来捕获变量名和值,但遗憾的是,我们不能将计算出的属性名和属性值速记结合起来

functopn example( varName ){
    var var1 = 'foo', var2 ='bar'

    var capture = {[varName]}

}

example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`

答案 10 :(得分:1)

eval()在我的测试中不起作用。但是可以向DOM树添加新的JavaScript代码。所以这是一个添加新变量的函数:

function createVariable(varName,varContent)
{
  var scriptStr = "var "+varName+"= \""+varContent+"\""

  var node_scriptCode = document.createTextNode( scriptStr )
  var node_script = document.createElement("script");
  node_script.type = "text/javascript"
  node_script.appendChild(node_scriptCode);

  var node_head = document.getElementsByTagName("head")[0]
  node_head.appendChild(node_script);
}

createVariable("dynamicVar", "some content")
console.log(dynamicVar)

答案 11 :(得分:1)

他们的意思是不,你不能。 没有办法完成它。 所以你有可能做这样的事情

function create(obj, const){
// where obj is an object and const is a variable name
function const () {}

const.prototype.myProperty = property_value;
// .. more prototype

return new const();

}

具有与ECMAScript 5中实现的创建功能相同的功能。

答案 12 :(得分:0)

使用对象也很棒。

var a=123
var b=234
var temp = {"a":a,"b":b}
console.log(temp["a"],temp["b"]);

答案 13 :(得分:0)

尽管这是一个可以接受的答案,但我想补充一点:

在ES6中使用let 不起作用

/*this is NOT working*/
let t = "skyBlue",
    m = "gold",
    b = "tomato";

let color = window["b"];
console.log(color);

但是使用var 可行

/*this IS working*/
var t = "skyBlue",
    m = "gold",
    b = "tomato";

let color = window["b"];
console.log(color);

我希望这对某些人有用。

答案 14 :(得分:0)

对于那些需要导出动态命名变量的人来说,这是一种替代方法

export {
  [someVariable]: 'some value',
  [anotherVariable]: 'another value',
}

// then.... import from another file like this:
import * as vars from './some-file'

另一种选择是简单地创建一个其键被动态命名的对象

const vars = { [someVariable]: 1, [otherVariable]: 2 };

// consume it like this
vars[someVariable];

答案 15 :(得分:0)

总是最好使用创建名称空间并在其中声明变量,而不是将其添加到全局对象。我们还可以创建一个函数来获取和设置值

请参见以下代码段:

//creating a namespace in which all the variables will be defined.
var myObjects={};

//function that will set the name property in the myObjects namespace
function setName(val){
  myObjects.Name=val;
}

//function that will return the name property in the myObjects namespace
function getName(){
  return myObjects.Name;
}

//now we can use it like:
  setName("kevin");
  var x = getName();
  var y = x;
  console.log(y)  //"kevin"
  var z = "y";
  console.log(z); //"y"
  console.log(eval(z)); //"kevin"

以类似的方式,我们可以声明和使用多个变量。尽管这将增加代码行,但是代码将更健壮且不易出错。

答案 16 :(得分:0)

这与您在php中所做的完全一样:

var a = 1;
var b = 2;
var ccc = 3;
var name = 'a';
console.log( window[name] ); // 1