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
?
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
).
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
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.
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);
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...
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.
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"]);
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']);
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.
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);
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)
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