我知道在 PHP 中可能有“变量”变量。例如,
$x = "variable";
$$x = "Hello, World!";
echo $variable; // Displays "Hello, World!"
是否可以在 JavaScript 中通过名称将变量引用为字符串?怎么做?
我知道在 PHP 中可能有“变量”变量。例如,
$x = "variable";
$$x = "Hello, World!";
echo $variable; // Displays "Hello, World!"
是否可以在 JavaScript 中通过名称将变量引用为字符串?怎么做?
tl;博士:不要使用eval
!
对此没有单一的解决方案。可以通过 动态访问一些全局变量window
,但这不适用于函数的局部变量。不成为 的属性的全局变量是用and和eswindow
定义的变量。let
const
class
几乎总有比使用可变变量更好的解决方案!相反,您应该查看数据结构并为您的问题选择正确的数据结构。
如果您有一组固定的名称,例如
// 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]);
在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));
那么您应该改用数组并简单地使用索引来访问相应的值:
// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);
如果您迫切需要这样做,您可以尝试使用 eval():
var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);
或使用窗口对象:
var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);
要在 JavaScript 中仅使用字符串引用变量,您可以使用
window['your_variable_name']
您也可以设置和引用变量以及变量中的对象。
与 PHP 不同,JavaScript 不提供对 globals 数组的访问(其中包含对当前声明的所有变量名的引用)。因此,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 声明变量变量(key in elementIds
),并将该元素的节点分配为每个变量的值。而且由于通常不鼓励在 JavaScript 中使用全局变量,因此给变量变量一个唯一的范围(在这种情况下,在elementIds
数组中声明它们)不仅简洁,而且更负责任。
当然可以,但不要。变量必须是全局的。
var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);
您可以使用全局 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({
...
});
您可以使用 JavaScripteval(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 手册。)