¿Variables "variables" en Javascript?

101

Sé que en PHP es posible tener variables "variables". Por ejemplo

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

¿Es posible referirse a una variable por su nombre como una cadena en javascript? ¿Cómo se haría?

Cordón1291
fuente
Las matrices no son variables, si usa una matriz como argumento de función, el intérprete de JS usará un puntero a su matriz. En la programación, el uso de ciertos términos es preciso, y lo que pides tiene muy poco significado
Mister Jojo

Respuestas:

147

No existe una solución única para esto (bueno, la hay eval, pero no lo consideremos seriamente). Es posible acceder a algunas variables globales dinámicamente a través de window, pero eso no funciona para las variables locales de una función. Las variables globales que no se convierten en propiedad de windowson variables definidas con lety const, y classes.

¡Casi siempre hay una solución mejor que usar variables variables! En su lugar, debería mirar las estructuras de datos y elegir la más adecuada para su problema.

Si tiene un conjunto fijo de nombres, como

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

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

almacene esos nombres / valores como propiedades de un objeto y use la notación entre corchetes para buscarlos dinámicamente:

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

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

En ES2015 + es aún más fácil hacer esto para las variables existentes usando una notación de propiedad concisa :

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

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


Si tiene variables numeradas "consecutivamente", como

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

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

entonces debería usar una matriz en su lugar y simplemente usar el índice para acceder al valor correspondiente:

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

Felix Kling
fuente
Ejemplos para definir valores múltiples: 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

Si está desesperado por hacer esto, puede intentar usar eval ():

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

O usando el objeto de ventana:

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

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

Masterbuddha
fuente
evalno se pueden crear variables locales en modo estricto. Sin embargo, una llamada indirecta puede crear variables globales.
Oriol
4

Para hacer referencia a una variable en javascript con solo una cadena, puede usar

window['your_variable_name']

Puede establecer y hacer referencia a variables y objetos en variables también.

Awesomeness01
fuente
4

A diferencia de PHP, JavaScript no ofrece acceso a la matriz global (que contiene referencias a todos los nombres de variables declarados actualmente). Como tal, JavaScript no ofrece soporte nativo para variables variables. Sin embargo, puede emular esta función siempre que defina todas sus variables como parte de una matriz o un objeto. Esto, a su vez, creará una matriz gloabls para usted. Por ejemplo, en lugar de declarar la variable helloen el ámbito global de esta manera:

var hello = 'hello world';

vamos a encapsularlo dentro de un objeto. Llamaremos a ese objeto vv (variables variables):

var vv = {
    'hello': 'hello world',
    //Other variable variables come here.
},
referToHello = 'hello';

Ahora podemos referirnos a la variable por su índice, y dado que los índices de matriz se pueden proporcionar usando una variable, de facto estamos haciendo uso de una variable variable:

console.log(vv[referToHello]); //Output: hello world

La respuesta a tu pregunta

Apliquemos esto al código que proporcionó en la pregunta original:

    var vv = {
        'x': 'variable',
        'variable': 'hello world!'
    };
    console.log(vv[vv['x']]); //Displays "hello, world!"

Un uso práctico

Si bien el código anterior puede parecer ridículamente engorroso y poco práctico, existen usos prácticos para las variables variables en JavaScript que utilizan este tipo de encapsulación. En el siguiente ejemplo, usamos el mismo concepto para obtener el ID de un 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 ejemplo declara variables variables (teclea elementIds) en base al ID de cada elemento, y asignará el nodo de dicho elemento como el valor de cada variable. Y dado que generalmente se desaconseja el uso de variables globales en JavaScript, dar a sus variables variables un alcance único (en este caso, declararlas dentro de la elementIdsmatriz) no solo es ordenado, sino también más responsable.

Nadav
fuente
2

Por supuesto que puede, pero no lo haga. Las variables tienen que ser globales.

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

Puede utilizar la eval(str)función de JavaScript .

Lo que hace esta función es convertir la cadena proporcionada en código JS y luego ejecutarla.

Por ejemplo:

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

Entonces, para usarlo como una variable variable, puede hacer lo siguiente:

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

Esto producirá exactamente el mismo resultado que:

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

(El ejemplo se toma del manual de PHP sobre variables variables ).

Abraham Murciano Benzadon
fuente