Use nomes de variables ​​dinâmicas em JavaScript

No PHP você pode fazer coisas incríveis / horrendas como esta:

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

Existe alguma maneira de fazer algo assim com JavaScript?

Por exemplo, se eu tiver um var name = 'the name of the variable'; posso obter uma referência para a variável com o nome do name ?

Como o ECMA- / Javascript tem tudo a ver com Objects e Contexts (que também são de alguma espécie de Object), cada variável é armazenada em uma variável chamada (ou no caso de uma function, object de ativação ).

Então, se você criar variables ​​como esta:

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

No escopo Global (= contexto da function NO), você escreve implicitamente essas variables ​​no object Global (= window em um navegador).

Aqueles podem ser acessados ​​usando a notação “ponto” ou “colchete”:

 var name = window.a; 

ou

 var name = window['a']; 

Isso só funciona para o object global nesta instância específica, porque o object de variável do object global é o object de window propriamente dito. Dentro do contexto de uma function, você não tem access direto ao object de ativação . Por exemplo:

 function foobar() { this.a = 1; this.b = 2; var name = window['a']; // === undefined alert(name); name = this['a']; // === 1 alert(name); } new foobar(); 

new cria uma nova instância de um object auto-definido (contexto). Sem new o escopo da function também seria global (= window). Este exemplo alertaria undefined e 1 respectivamente. Se nós replaceíamos this.a = 1; this.b = 2 this.a = 1; this.b = 2 com:

 var a = 1, b = 2; 

Ambas as saídas de alerta seriam indefinidas. Nesse cenário, as variables b seriam armazenadas no object de ativação do foobar , que não podemos acessar (é claro que poderíamos acessá-las diretamente chamando a e b ).

eval é uma opção.

 var a = 1; var name = 'a'; document.write(eval(name)); // 1 

Você pode usar o object da janela para obtê-lo.

 window['myVar'] 

window tem uma referência a todas as variables ​​globais e funções globais que você está usando.

Só não sei o que uma resposta ruim recebe tantos votos. É uma resposta bem fácil, mas você a torna complexa.

 // 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); 
 a = 'varname'; str = a+' = '+'123'; eval(str) alert(varname); 

Tente isso …

Isto é um exemplo :

 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 

Outro exemplo :

 var myVariable = 'coco'; window[myVariable] = 'riko'; alert(coco); // display : riko 

Então, o valor " coco " da myVariable se torna uma variável coco .

Porque todas as variables ​​no escopo global são propriedades do object Window.

Em Javascript, você pode usar o fato de que todas as propriedades são pares de valores-chave. jAndy já mencionou isso, mas não acho que a resposta dele mostre como ele pode ser explorado.

Normalmente, você não está tentando criar uma variável para manter um nome de variável, mas está tentando gerar nomes de variables ​​e usá-los. O PHP faz isso com a notação $$var , mas o Javascript não precisa, porque as chaves de propriedade são intercambiáveis ​​com as chaves do array.

 var id = "abc"; var mine = {}; mine[id] = 123; console.log(mine.abc); 

dá 123. Normalmente você quer construir a variável e é por isso que existe a indirecção, então você também pode fazer o inverso.

 var mine = {}; mine.abc = 123; console.log(mine["a"+"bc"]); 

o que eles querem dizer é não, você não pode. não há como fazê-lo. então era possível que você pudesse fazer algo assim

 function create(obj, const){ // where obj is an object and const is a variable name function const () {} const.prototype.myProperty = property_value; // .. more prototype return new const(); } 

ter uma function de criação como a implementada no ECMAScript 5.

Se você não quiser usar um object global como window ou global (node), você pode tentar algo como isto:

 var obj = {}; obj['whatever'] = 'There\'s no need to store even more stuff in a global object.'; console.log(obj['whatever']); 

Eu precisava desenhar vários FormData on the fly e maneira de object funcionou bem

 var forms = {} 

Então nos meus loops onde eu precisava para criar um formulário de dados que eu usei

 forms["formdata"+counter]=new FormData(); forms["formdata"+counter].append(var_name, var_value); 

eval () não funcionou nos meus testes. Mas adicionar novo código JavaScript à tree DOM é possível. Então aqui está uma function que adiciona uma nova variável:

 function createVariable(varName,varContent) { var scriptStr = "var "+varName+"= \""+varContent+"\"" var node_scriptCode = document.createTextNode( scriptStr ) var node_script = document.createElement("script"); node_script.type = "text/javascript" node_script.appendChild(node_scriptCode); var node_head = document.getElementsByTagName("head")[0] node_head.appendChild(node_script); } createVariable("dynamicVar", "some content") console.log(dynamicVar)