JavaScript中的“变量”变量?


101

我知道在PHP中可能有“变量”变量。例如

$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"

是否可以在JavaScript中将变量的名称引用为字符串?怎么做?


数组不是变量,如果将数组用作函数参数,则JS解释器将使用指向数组的指针。在编程中使用的特定术语是精确的,什么你问只有很少的意义
老总乔乔

Answers:


147

对此没有单一的解决方案(当然,有eval,但是请不要认真考虑)。可以通过来动态访问一些全局变量window,但这不适用于函数本地的变量。不会成为属性的全局变量是window使用letconst和定义的变量class

几乎总是比使用可变变量更好的解决方案!相反,您应该查看数据结构并为您的问题选择正确的结构

如果您有一组固定的名称,例如

// BAD
var foo = 42;
var bar = 21;

var key = 'foo';
console.log(eval(key));

将这些名称/值存储为对象的属性,并使用方括号表示法动态查找它们:

// GOOD
var obj = {
  foo: 42,
  bar: 21,
};

var key = 'foo';
console.log(obj[key]);

ES2015 +中,使用简明的属性符号对现有变量执行此操作更加容易:

// GOOD
var foo = 42;
var bar = 21;
var obj = {foo, bar};

var key = 'foo';
console.log(obj[key]);


如果您有“连续”编号的变量,例如

// BAD
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';

var index = 1;
console.log(eval('foo' + index));

那么您应该改用数组,而只需使用索引即可访问相应的值:

// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);


定义多个值的示例:var x = 1; var x,y = 2; x = 1; var x = 1,y = 2; var x = xx = 1; var y = x + x;
Amin Maleki

42

如果您很想这样做,可以尝试使用eval():

var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);

或使用window对象:

var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);

http://www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript


eval无法在严格模式下创建局部变量。但是,间接调用可以创建全局变量。
Oriol

4

要仅用字符串引用javascript中的变量,可以使用

window['your_variable_name']

您可以设置和引用变量以及变量中的对象。


4

与PHP不同,JavaScript不提供对globals数组的访问(该数组包含对当前声明的所有变量名的引用)。因此,JavaScript不为变量提供原生支持。但是,只要将所有变量定义为数组或对象的一部分,就可以模拟此功能。这将反过来为您创建一个gloabls数组。例如,与其hello像这样在全局范围内声明变量,不如:

var hello = 'hello world';

让我们将其封装在一个对象中。我们称该对象为vv(变量):

var vv = {
    'hello': 'hello world',
    //Other variable variables come here.
},
referToHello = 'hello';

现在我们可以通过变量的索引来引用它,并且由于可以使用变量来提供数组索引,因此我们实际上是在使用变量:

console.log(vv[referToHello]); //Output: hello world

您问题的答案

让我们将其应用于原始问题中提供的代码:

    var vv = {
        'x': 'variable',
        'variable': 'hello world!'
    };
    console.log(vv[vv['x']]); //Displays "hello, world!"

实际使用

尽管先前的代码看起来非常笨拙且不切实际,但是使用这种类型的封装的JavaScript中的可变变量有实际用途。在下面的示例中,我们使用相同的概念来获取未定义数量的HTML元素的ID。

var elementIds = [],
        elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc.
        elements.forEach( (element) => {
            elementIds[element] = document.getElementById(element);
        });

本示例elementIds根据每个元素的ID 声明变量变量(中的键),并将该元素的节点分配为每个变量的值。而且,由于通常不鼓励在JavaScript中使用全局变量,因此要给变量变量一个唯一的范围(在这种情况下,在elementIds数组内声明它们)不仅整洁,而且更加负责。



2
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);

0

您可以使用JavaScript eval(str)函数。

该函数的作用是将提供的字符串转换为JS代码,然后执行它。

例如:

eval("console.log('hello world')"); // Logs hello world

因此,要将其用作变量变量,可以执行以下操作:

var a = "hello";
var hello = "world";
console.log(a + " " + eval(a)); // Logs hello world

这将产生与以下内容完全相同的输出:

console.log(a + " " + hello); // Logs hello world

(示例摘自PHP手册中的变量变量。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.