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
?
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
).
eval
est une option.
var a = 1;
var name = 'a';
document.write(eval(name)); // 1
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.
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);
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);
Essayez ceci...
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.
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"]);
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']);
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.
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);
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)