Variáveis ​​“variáveis” em Javascript?

101

Eu sei que é possível em PHP ter variáveis ​​"variáveis". Por exemplo

$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"

É possível se referir a uma variável por seu nome como uma string em javascript? Como isso seria feito?

ShoeLace1291
fonte
arrays não são variáveis, se você usar um array como argumento de função, o interpretador JS usará um ponteiro para seu array. Na programação, o uso de certos termos é preciso, e o que você pede tem muito pouco significado
Senhor Jojo

Respostas:

147

Não existe uma solução única para isso (bem, existe eval, mas não vamos considerar isso seriamente). É possível acessar algumas variáveis ​​globais dinamicamente via window, mas isso não funciona para variáveis ​​locais de uma função. Variáveis ​​globais que não se tornam uma propriedade de windowsão variáveis ​​definidas com lete const, e classes.

Quase sempre existe uma solução melhor do que usar variáveis ​​variáveis! Em vez disso, você deve examinar as estruturas de dados e escolher a correta para o seu problema.

Se você tiver um conjunto fixo de nomes, como

// BAD
var foo = 42;
var bar = 21;

var key = 'foo';
console.log(eval(key));

armazene esses nomes / valores como propriedades de um objeto e use a notação de colchetes para procurá-los dinamicamente:

// GOOD
var obj = {
  foo: 42,
  bar: 21,
};

var key = 'foo';
console.log(obj[key]);

No ES2015 + é ainda mais fácil fazer isso para variáveis ​​existentes usando notação de propriedade concisa :

// GOOD
var foo = 42;
var bar = 21;
var obj = {foo, bar};

var key = 'foo';
console.log(obj[key]);


Se você tiver variáveis ​​numeradas "consecutivamente", como

// BAD
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';

var index = 1;
console.log(eval('foo' + index));

então, você deve usar uma matriz e simplesmente usar o índice para acessar o valor correspondente:

// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);

Felix Kling
fonte
Exemplos para definir vários valores: var x = 1; var x, y = 2; x = 1; var x = 1, y = 2; var x = xx = 1; var y = x + x;
Amin Maleki
42

Se você está desesperado para fazer isso, você pode tentar usar eval ():

var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);

Ou usando o objeto janela:

var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);

http://www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript

Mestre buddha
fonte
evalnão pode criar variáveis ​​locais no modo estrito. Uma chamada indireta pode criar variáveis ​​globais, no entanto.
Oriol
4

Para fazer referência a uma variável em javascript com apenas uma string, você pode usar

window['your_variable_name']

Você pode definir e referenciar variáveis ​​e objetos em variáveis ​​também.

Awesomeness01
fonte
4

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 hellono 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 elementIdsarray) não é apenas legal, mas também mais responsável.

Nadav
fonte
2

Claro que você pode, mas não faça. As variáveis ​​devem ser globais.

var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
Konrad Borowski
fonte
2
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);
lkdhruw
fonte
0

Você pode usar o JavaScript eval(str) função .

O que essa função faz é converter a string fornecida em código JS e, em seguida, executá-la.

Por exemplo:

eval("console.log('hello world')"); // Logs hello world

Portanto, para usá-lo como uma variável variável, você pode fazer o seguinte:

var a = "hello";
var hello = "world";
console.log(a + " " + eval(a)); // Logs hello world

Isso produzirá exatamente a mesma saída que:

console.log(a + " " + hello); // Logs hello world

(O exemplo é retirado do manual do PHP sobre variáveis ​​variáveis .)

Abraham Murciano Benzadon
fonte