Usar nombres de variables dinámicas en JavaScript


En PHP puedes hacer cosas increíbles/horrendas como esta:

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

¿Hay alguna forma de hacer algo como esto con Javascript?

Por ejemplo, si tengo un var name = 'the name of the variable'; ¿puedo obtener una referencia a la variable con name name?

Author: user2864740, 2011-02-25

11 answers

Dado que ECMA-/Javascript se trata de Objects y Contexts (que también son algún tipo de Objeto), cada variable se almacena en una Variable llamada - (o en el caso de una Función, Objeto de activación).

Así que si creas variables como esta:

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

En el ámbito global (= SIN contexto de función), usted escribe implícitamente esas variables en el objeto Global (= window en un navegador).

Se puede acceder a ellos mediante el uso de la notación" dot "o" bracket":

var name = window.a;

O

var name = window['a'];

Esto solo funciona para el objeto global en esta instancia particular, porque el Objeto Variable del Objeto Global es el objeto window en sí. Dentro del Contexto de una función, no tiene acceso directo al Objeto de activación . Por ejemplo:

function foobar() {
   this.a = 1;
   this.b = 2;

   var name = window['a']; // === undefined
   alert(name);
   name = this['a']; // === 1
   alert(name);
}

new foobar();

new crea una nueva instancia de un objeto autodefinido (contexto). Sin new el alcance de la función sería también global (=ventana). Este ejemplo alertaría a undefined y 1 respectivamente. Si reemplazáramos this.a = 1; this.b = 2 por:

var a = 1,
    b = 2;

Ambas salidas de alerta serían indefinidas. En ese escenario, las variables a y b se almacenarían en el Objeto de Activación desde foobar, al que no podemos acceder (por supuesto, podríamos acceder directamente llamando a a y b).

 290
Author: jAndy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-02 23:54:43

eval es una opción.

var a = 1;
var name = 'a';

document.write(eval(name)); // 1
 127
Author: erickb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-25 12:22:34

Puede usar el objeto window para llegar a él .

window['myVar']

window tiene una referencia a todas las variables globales y funciones globales que está utilizando.

 61
Author: JohnP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-30 12:04:10

Simplemente no sé qué mala respuesta obtiene tantos votos. Es una respuesta bastante fácil, pero la haces compleja.

// 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);
 29
Author: Terry Lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-21 09:39:31
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);

Prueba esto...

 28
Author: amitchd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-25 12:23:58

Este es un ejemplo :

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

Otro ejemplo :

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

alert(coco); // display : riko

Entonces, el valor " coco" de myVariablese convierte en una variable coco.

Porque todas las variables en el ámbito global son propiedades del objeto Window.

 21
Author: Azodium,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-18 12:05:19

En Javascript se puede utilizar el hecho de que todas las propiedades son pares de valores clave. jAndy ya mencionó esto, pero no creo que su respuesta muestre cómo se puede explotar.

Por lo general, no está tratando de crear una variable para contener un nombre de variable, sino que está tratando de generar nombres de variables y luego usarlos. PHP lo hace con notación $$var pero Javascript no necesita hacerlo porque las claves de propiedad son intercambiables con las claves de matriz.

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

Da 123. Por lo general, desea construir la variable que es la razón por la que existe la indirección por lo que también puede hacerlo al revés.

var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);
 11
Author: David Newcomb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-27 02:42:47

Si no desea utilizar un objeto global como window o global (nodo), puede intentar algo como esto:

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

console.log(obj['whatever']);
 3
Author: Brent Barbata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-30 00:06:51

Lo que quieren decir es que no, no puedes. no hay manera de hacerlo. así que era posible que pudieras hacer algo como esto

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();

}

Tener una función create como la implementada en ECMAScript 5.

 2
Author: Alfgaar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-24 05:29:27

Necesitaba dibujar múltiples FormData sobre la marcha y la forma del objeto funcionó bien

var forms = {}

Luego en mis bucles donde sea que necesite crear un formulario de datos usé

forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);
 2
Author: Talha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-17 23:21:21

Eval() no funcionó en mis pruebas. Pero agregar nuevo código JavaScript al árbol DOM es posible. Así que aquí hay una función que agrega una nueva variable:

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)
 0
Author: Axel Heider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-04 11:37:09