Utiliser des noms de variables dynamiques en JavaScript

En PHP, vous pouvez faire des choses incroyables/horribles comme ceci:

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

Est - il possible de faire quelque chose comme ça avec Javascript?

Par exemple, si j'ai un var name = 'the name of the variable'; Puis-je obtenir une référence à la variable avec le nom name?

272
demandé sur user2864740 2011-02-25 15:19:26

11 réponses

Depuis ECMA - / Javascript est tout au sujet de Objects et Contexts (qui, sont aussi une sorte D'objet), chaque variable est stockée dans un tel appelé Variable- (ou dans le cas d'une fonction, objet D'Activation).

Donc, si vous créez des variables comme ceci:

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

Dans la portée globale (=pas de contexte de fonction), vous écrivez implicitement ces variables dans l'objet Global (= window dans un navigateur).

Ceux-ci peuvent être accessibles en utilisant le notation " point "ou " support":

var name = window.a;

Ou

var name = window['a'];

Cela ne fonctionne que pour l'objet global dans cette instance particulière, car l'objet variable de l'objet Global est l'objet window lui-même. Dans le contexte d'une fonction, vous n'avez pas d'accès direct à l'objet D'Activation . Par exemple:

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

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

new foobar();

new crée une nouvelle instance d'un objet défini (contexte). Sans new, la portée de la fonction serait également global (=fenêtre). Cet exemple alerterait undefined et 1 respectivement. Si nous remplacerions this.a = 1; this.b = 2 par:

var a = 1,
    b = 2;

Les Deux sorties d'Alerte ne seraient pas définies. Dans ce scénario, les variables a et b seraient stockées dans l'objet D'Activation à partir de foobar, auquel nous ne pouvons pas accéder (bien sûr, nous pourrions y accéder directement en appelant a et b).

290
répondu jAndy 2012-12-02 23:54:43

eval est une option.

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

document.write(eval(name)); // 1
127
répondu erickb 2011-02-25 12:22:34

Vous pouvez utiliser l'objet window pour y arriver .

window['myVar']

window a une référence à toutes les variables globales et les fonctions globales que vous utilisez.

61
répondu JohnP 2018-03-30 12:04:10

Je ne sais tout simplement pas quelle mauvaise réponse obtient autant de votes. C'est une réponse assez facile mais vous la rendez complexe.

// 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
répondu Terry Lin 2015-01-21 09:39:31
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);

Essayez ceci...

28
répondu amitchd 2011-02-25 12:23:58

Voici un exemple:

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

Un autre exemple:

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

alert(coco); // display : riko

Ainsi, la valeur "coco" de mavariable devient une variable coco.

Parce que toutes les variables de la portée globale sont des propriétés de L'objet Window.

21
répondu Azodium 2016-11-18 12:05:19

En Javascript, vous pouvez utiliser le fait que toutes les propriétés sont des paires clé-valeur. jAndy l'a déjà mentionné mais je ne pense pas que sa réponse montre comment il peut être exploité.

Habituellement, vous n'essayez pas de créer une variable pour contenir un nom de variable, mais essayez de générer des noms de variables, puis de les utiliser. PHP le fait avec la notation $$var mais Javascript n'en a pas besoin car les clés de propriété sont interchangeables avec les clés de tableau.

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

Donne 123. Habituellement, vous voulez construire la variable, c'est pourquoi il y a l'indirection, donc vous pouvez aussi le faire dans l'autre sens.

var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);
11
répondu David Newcomb 2014-11-27 02:42:47

Si vous ne voulez pas utiliser un objet global comme window ou global (node), vous pouvez essayer quelque chose comme ceci:

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

console.log(obj['whatever']);
3
répondu Brent Barbata 2015-01-30 00:06:51

Ce qu'ils veulent dire est non, vous ne pouvez pas. il n'y a aucun moyen de le faire. il était donc possible que vous puissiez faire quelque chose comme ça

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

}

Ayant une fonction create comme celle implémentée dans ECMAScript 5.

2
répondu Alfgaar 2012-11-24 05:29:27

J'avais besoin de dessiner plusieurs FormData à la volée et la manière d'objet fonctionnait bien

var forms = {}

, Puis dans mes boucles où j'avais besoin de créer un formulaire de données j'ai utilisé

forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);
2
répondu Talha 2017-09-17 23:21:21

Eval () n'a pas fonctionné dans mes tests. Mais l'ajout D'un nouveau code JavaScript à L'arborescence DOM est possible. Voici donc une fonction qui ajoute une nouvelle 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
répondu Axel Heider 2015-05-04 11:37:09