JavaScript 中的“可变”变量

问题描述 投票:0回答:9

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

$x = "variable";
$$x = "Hello, World!";
echo $variable; // Displays "Hello, World!"

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

javascript variables variable-variables
9个回答
176
投票

tl;博士:不要使用

eval

没有单一的解决方案。可以通过 window 动态访问

some
全局变量,但这不适用于函数的局部变量。 成为
window
属性的全局变量是用
let
const
定义的变量,以及
class
es.

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

如果你有一套固定的名字,比如

// BAD - DON'T DO THIS!!!
var foo = 42;
var bar = 21;

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

将这些名称/值存储为 object 的属性,并使用 bracket notation 动态查找它们:

// 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 - DON'T DO THIS!!!
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';

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

那么你应该使用一个 array 并简单地使用索引来访问相应的值:

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


41
投票

如果你急于这样做,你可以尝试使用 eval():

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

或者使用窗口对象:

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

6
投票

要在 JavaScript 中仅使用字符串引用变量,您可以使用

window['your_variable_name']

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


5
投票

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

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);
        });

本例根据每个元素的ID声明了可变变量(

elementIds
中的keys),并将该元素的节点赋值为每个变量的值。而且由于通常不鼓励在 JavaScript 中使用全局变量,因此给变量变量一个唯一的范围(在本例中,在
elementIds
数组中声明它们)不仅简洁,而且更负责任。


3
投票

您可以使用global

window
对象,或
this

window

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

或使用点:

var data = "anyVariableName";
window.data = 123;
alert(window.data); //123

这个:

ar data = "anyVariableName";
this["temp_" + data] = 123;
alert(this["temp_" + data]); //123

或使用点

var data = "anyVariableName";
this.data = 123;
alert(this.data); //123

现实生活中的例子:

var tasksTableNameRandom = 'tasksTable_' + Math.random().toString(36).substr(2, 5);
console.log('Tasks Table Object name: ' + tasksTableNameRandom);
this.tasksTableNameRandom = $('#tasks-data-table').DataTable({
    ...
});

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

2
投票

当然可以,但不要。变量必须是全局的。

var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])


0
投票

我用一个对象来做这个。无需使用窗口:

var myVars = {};

let foo = "hello";
myVars[foo] = 100;
let bar = myVars[foo];

只需确保 myVars 是全局的。


-2
投票

您可以使用JavaScript

eval(str)
函数。

这个函数将提供的字符串转换成JavaScript代码,然后执行。

例如:

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 变量手册。)

© www.soinside.com 2019 - 2024. All rights reserved.