JavaScript中的“变量”变量

l7mqbcuq  于 2023-02-21  发布在  Java
关注(0)|答案(8)|浏览(119)

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

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

在JavaScript中,是否可以通过变量名来引用一个字符串?如何实现?

ffscu2ro

ffscu2ro1#

文件名;文件名:Don't use eval !

这个问题没有单一的解决方案。可以通过window动态访问 * 一些 * 全局变量,但这对函数的局部变量不起作用。* 不 * 成为window属性的全局变量是用letconst以及class定义的变量。

**几乎总是有比使用变量更好的解决方案!**相反,您应该查看data structures并选择适合您的问题的解决方案。

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

// BAD - DON'T DO THIS!!!
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]);

在**ES 2015 +**中,使用 * 简洁的属性表示法 * 对现有变量执行此操作更容易:

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

那么你应该使用一个数组来代替,并且简单地使用索引来访问相应的值:

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

pjngdqdw2#

如果你非常想这么做,你可以尝试使用eval():

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

或者使用window对象:

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

hpxqektj3#

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

window['your_variable_name']

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

ujv3wf0j

ujv3wf0j4#

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

var hello = 'Hello, World!';

让我们把它封装在一个对象中,我们把这个对象命名为vv(variable variables):

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

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

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中的键),并将该元素的节点赋为每个变量的值。由于JavaScript中通常不鼓励使用全局变量,因此给变量变量一个唯一的作用域(在这个例子中,在elementIds数组中声明它们)不仅简洁,而且更可靠。

vsikbqxv

vsikbqxv5#

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

sf6xfgos6#

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

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

0tdrvxhp7#

您可以使用 * 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({
    ...
});
qc6wkl3g

qc6wkl3g8#

您可以使用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

(示例取自the PHP manual on variable variables。)

相关问题