在PHP中,你可以做这样惊人/可怕的事情:

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

有什么方法可以用Javascript做这样的事情吗?

例如,如果我有一个var name = '变量的名称';我可以得到一个引用的变量与名称?


当前回答

由于ECMA-/Javascript是关于对象和上下文的(也是某种对象),每个变量都存储在一个所谓的变量中(或者在函数的情况下,激活对象)。

如果你创建这样的变量:

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

在Global作用域(= NO函数上下文)中,您隐式地将这些变量写入Global对象(=浏览器中的窗口)。

这些可以通过使用“点”或“括号”符号来访问:

var name = window.a;

or

var name = window['a'];

这只适用于这个特定实例中的全局对象,因为全局对象的变量对象是窗口对象本身。在函数的上下文中,您不能直接访问激活对象。例如:

函数foobar() { 这一点。A = 1; 这一点。B = 2; Var name = window['a'];// === undefined console.log(名称); Name = this['a'];// === 1 console.log(名称); } 新foobar ();

New创建一个自定义对象(context)的新实例。如果没有new,函数的作用域也是global (=window)。这个例子将分别警告为undefined和1。如果我们替换这个。A = 1;这一点。B = 2 with:

var a = 1,
    b = 2;

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

其他回答

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

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];

只是不知道为什么一个糟糕的答案能得到这么多票。这个答案很简单,但你把它弄复杂了。

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

最简单的解决方案:创建一个对象数组,每个对象都有两个字段(variableName,variableValue)

let allVariables = [];

for (let i = 0; i < 5; i++)
    allVariables.push({ variableName: 'variable' + i, variableValue: i * 10 });

for (let i = 0; i < allVariables.length; i++)
    console.log(allVariables[i].variableName + ' is ' + allVariables[i].variableValue);

输出:

variable0 is 0
variable1 is 10
variable2 is 20
variable3 is 30
variable4 is 40

console.log(allVariables) json :

 [
    {
        "variableName": "variable0",
        "variableValue": 0
    },
    {
        "variableName": "variable1",
        "variableValue": 10
    },
    {
        "variableName": "variable2",
        "variableValue": 20
    },
    {
        "variableName": "variable3",
        "variableValue": 30
    },
    {
        "variableName": "variable4",
        "variableValue": 40
    }
]

虽然这有一个公认的答案,但我想补充一个观察:

在ES6中使用let无效:

/*这不是工作*/ let t = "skyBlue", M = "黄金", B = "番茄"; Let color = window["b"]; console.log(颜色);

但是使用var是可行的

/*这个正在工作*/ var t = "skyBlue", M = "黄金", B = "番茄"; Let color = window["b"]; console.log(颜色);

我希望这对一些人有用。

由于ECMA-/Javascript是关于对象和上下文的(也是某种对象),每个变量都存储在一个所谓的变量中(或者在函数的情况下,激活对象)。

如果你创建这样的变量:

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

在Global作用域(= NO函数上下文)中,您隐式地将这些变量写入Global对象(=浏览器中的窗口)。

这些可以通过使用“点”或“括号”符号来访问:

var name = window.a;

or

var name = window['a'];

这只适用于这个特定实例中的全局对象,因为全局对象的变量对象是窗口对象本身。在函数的上下文中,您不能直接访问激活对象。例如:

函数foobar() { 这一点。A = 1; 这一点。B = 2; Var name = window['a'];// === undefined console.log(名称); Name = this['a'];// === 1 console.log(名称); } 新foobar ();

New创建一个自定义对象(context)的新实例。如果没有new,函数的作用域也是global (=window)。这个例子将分别警告为undefined和1。如果我们替换这个。A = 1;这一点。B = 2 with:

var a = 1,
    b = 2;

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