Diferente do PHP, JavaScript não oferece acesso ao array global (que contém referências a todos os nomes de variáveis declarados atualmente). Como tal, o JavaScript não oferece suporte nativo para variáveis variáveis. Você pode, no entanto, emular esse recurso, desde que defina todas as suas variáveis como parte de um array ou objeto. Isso, por sua vez, criará um array gloabls para você. Por exemplo, em vez de declarar a variável hello
no escopo global assim:
var hello = 'hello world';
vamos encapsulá-lo dentro de um objeto. Chamaremos esse objeto de vv (variáveis variáveis):
var vv = {
'hello': 'hello world',
//Other variable variables come here.
},
referToHello = 'hello';
Agora podemos nos referir à variável por seu índice, e como os índices de array podem ser fornecidos usando uma variável, estamos de fato fazendo uso de uma variável variável:
console.log(vv[referToHello]); //Output: hello world
A resposta à sua pergunta
Vamos aplicar isso ao código que você forneceu na pergunta original:
var vv = {
'x': 'variable',
'variable': 'hello world!'
};
console.log(vv[vv['x']]); //Displays "hello, world!"
Um uso prático
Embora o código anterior possa parecer ridiculamente complicado e impraticável, há usos práticos para variáveis variáveis em JavaScript usando esse tipo de encapsulamento. No exemplo abaixo, usamos o mesmo conceito para obter o ID de um número indefinido de elementos HTML.
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);
});
Este exemplo declara variáveis variáveis (digita elementIds
) com base no ID de cada elemento e atribuirá o nó desse elemento como o valor de cada variável. E uma vez que usar variáveis globais em JavaScript é geralmente desencorajado, dar às suas variáveis de variáveis um escopo exclusivo (neste caso, declará-las dentro do elementIds
array) não é apenas legal, mas também mais responsável.