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

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

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

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


当前回答

使用Object也很棒。

var a=123
var b=234
var temp = {"a":a,"b":b}
console.log(temp["a"],temp["b"]);

其他回答

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

在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(颜色);

我希望这对一些人有用。

最好使用创建名称空间并在其中声明变量,而不是将其添加到全局对象。我们还可以创建一个函数来获取和设置值

请看下面的代码片段:

//creating a namespace in which all the variables will be defined.
var myObjects={};

//function that will set the name property in the myObjects namespace
function setName(val){
  myObjects.Name=val;
}

//function that will return the name property in the myObjects namespace
function getName(){
  return myObjects.Name;
}

//now we can use it like:
  setName("kevin");
  var x = getName();
  var y = x;
  console.log(y)  //"kevin"
  var z = "y";
  console.log(z); //"y"
  console.log(eval(z)); //"kevin"

以类似的方式,我们可以声明和使用多个变量。虽然这将增加代码行数,但代码将更健壮,更不容易出错。

这是一个例子:

for(var i=0; i<=3; i++) {
    window['p'+i] = "hello " + i;
}

alert(p0); // hello 0
alert(p1); // hello 1
alert(p2); // hello 2
alert(p3); // hello 3

另一个例子:

var myVariable = 'coco';
window[myVariable] = 'riko';

alert(coco); // display : riko

因此,myVariable的值“coco”变成了一个变量coco。

因为全局作用域中的所有变量都是Window对象的属性。

使用Object也很棒。

var a=123
var b=234
var temp = {"a":a,"b":b}
console.log(temp["a"],temp["b"]);

2019

博士TL;

Eval操作符可以在它调用的上下文中运行字符串表达式,并从该上下文中返回变量; 字面对象理论上可以通过write:{[varName]}来做到这一点,但它被定义阻塞了。

所以我遇到这个问题,这里的每个人都只是玩玩,没有提出真正的解决方案。但是@阿克塞尔·海德有一个很好的接近。

解是eval。 几乎是最被遗忘的运算符。(我想大多数人都是())

Eval运算符可以在它调用的上下文中动态运行表达式。并返回该表达式的结果。我们可以使用它在函数的上下文中动态返回变量的值。

例子:

function exmaple1(){
   var a = 1, b = 2, default = 3;
   var name = 'a';
   return eval(name)
}

example1() // return 1


function example2(option){
  var a = 1, b = 2, defaultValue = 3;

  switch(option){
    case 'a': name = 'a'; break;
    case 'b': name = 'b'; break;
    default: name = 'defaultValue';
  }
  return eval (name);
}

example2('a') // return 1
example2('b') // return 2
example2() // return 3

注意,我总是显式地写eval将运行的表达式。 避免代码中出现不必要的意外。Eval非常强 但我相信你已经知道了

顺便说一句,如果合法的话,我们可以使用字面对象来捕获变量名和值,但我们不能将计算的属性名和属性值简写结合起来,遗憾的是,这是无效的

functopn example( varName ){
    var var1 = 'foo', var2 ='bar'

    var capture = {[varName]}

}

example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`