En PHP, vous pouvez faire des choses incroyables / horribles comme ceci:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
Existe-t-il un moyen 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 un nom name
?
javascript
dynamic-variables
Finbarr
la source
la source
Réponses:
Puisque ECMA- / Javascript est tout au sujet de
Objects
etContexts
(qui sont également une sorte d'objet), chaque variable est stockée dans une telle appelée Variable- (ou dans le cas d'une fonction, un objet d'activation ).Donc, si vous créez des variables comme ceci:
Dans la portée globale (= contexte de fonction NO), vous écrivez implicitement ces variables dans l' objet global (=
window
dans un navigateur).Ceux-ci sont accessibles en utilisant la notation "point" ou "parenthèse":
ou
Cela ne fonctionne que pour l'objet global dans cette instance particulière, car l' objet variable de l' objet global est l'
window
objet lui-même. Dans le contexte d'une fonction, vous n'avez pas d'accès direct à l' objet d'activation . Par exemple:new
crée une nouvelle instance d'un objet auto-défini (contexte). Sansnew
la portée de la fonction serait égalementglobal
(= fenêtre). Cet exemple alerteraitundefined
et1
respectivement. Si nous remplacionsthis.a = 1; this.b = 2
par:Les deux sorties d'alerte ne seraient pas définies. Dans ce scénario, les variables
a
etb
seraient stockées dans l'objet d'activation à partirfoobar
duquel nous ne pouvons pas accéder (bien sûr, nous pourrions accéder directement à celles-ci en appelanta
etb
).la source
eval
est une option.la source
Vous pouvez utiliser l'objet fenêtre pour y accéder.
window
contient une référence à toutes les variables globales et fonctions globales que vous utilisez.la source
Je ne sais pas ce qu'une mauvaise réponse obtient autant de votes. C'est une réponse assez simple mais vous la rendez complexe.
la source
this
" - Si vous voulez accéder à une variable globale de cette façon, il vaut mieux être explicite et utiliser l'window
objet, nonthis
.this
c'est ambigu.this
, ou quoi que ce soit d'autre, pour accéder à la variabletype
de votre exemple, si vous avez son nom dans une autre variable:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')
s'afficheraarticle
, nonsomething else
. Et c'est ce qu'explique la «réponse complexe».Essaye ça...
la source
Ceci est un exemple :
Un autre exemple :
Ainsi, la valeur " coco " de myVariable devient un coco variable .
Parce que toutes les variables de la portée globale sont des propriétés de l'objet Window.
la source
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 cela 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 variable, puis de les utiliser. PHP le fait avec
$$var
notation mais Javascript n'est pas nécessaire car les clés de propriété sont interchangeables avec les clés de tableau.donne 123. Habituellement, vous voulez construire la variable, c'est pourquoi il y a l'indirection afin que vous puissiez également le faire dans l'autre sens.
la source
2019
TL; DR
eval
L'opérateur peut exécuter l'expression de chaîne dans le contexte qu'il a appelé et renvoyer des variables de ce contexte;literal object
peut théoriquement le faire en écrivant:,{[varName]}
mais il a bloqué par définition.Je tombe donc sur cette question et tout le monde ici joue juste sans apporter une vraie solution. mais @Axel Heider a une bonne approche.
La solution est
eval
. opérateur presque le plus oublié. (pense que la plupart sontwith()
)eval
L'opérateur peut exécuter dynamiquement l'expression dans le contexte qu'il a appelé. et retourner le résultat de cette expression. nous pouvons l'utiliser pour retourner dynamiquement la valeur d'une variable dans le contexte de la fonction.exemple:
Notez que j'écris toujours explicitement l'expression
eval
s'exécutera. Pour éviter des surprises inutiles dans le code.eval
est très fort Mais je suis sûr que vous savez que déjàBTW, si c'était légal, nous pourrions utiliser
literal object
pour capturer le nom et la valeur de la variable, mais nous ne pouvons pas combiner les noms de propriété calculés et la valeur de la propriété, malheureusement, n'est pas validela source
Si vous ne souhaitez pas utiliser un objet global comme window ou global (node), vous pouvez essayer quelque chose comme ceci:
la source
Je devais dessiner plusieurs FormData à la volée et la méthode d'objet fonctionnait bien
Ensuite, dans mes boucles où j'avais besoin de créer un formulaire de données que j'utilisais
la source
Ceci est une alternative pour ceux qui ont besoin d'exporter une variable nommée dynamiquement
Une autre alternative consiste à créer simplement un objet dont les clés sont nommées dynamiquement
la source
ce qu'ils signifient 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
ayant une fonction de création comme celle implémentée dans ECMAScript 5.
la source
eval
opérateureval () n'a pas fonctionné dans mes tests. Mais l'ajout de nouveau code JavaScript à l'arborescence DOM est possible. Voici donc une fonction qui ajoute une nouvelle variable:
la source
var node_head = document.getElementsByTagName("head")[0]
place de l'ID, car personne ne donne unid="head"
à<head>
:-)Bien que cela ait une réponse acceptée, je voudrais ajouter une observation:
Dans ES6, l'utilisation
let
ne fonctionne pas :Cependant en utilisant des
var
œuvresJ'espère que cela pourra être utile à certains.
la source
const
const vars = { t, m, b }; console.log(vars['b'])
. Sinon, çaeval
marche aussi.utiliser Object est super aussi.
la source