Variabili "variabili" in Javascript?


101

So che è possibile in PHP avere variabili "variabili". Per esempio

$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"

È possibile fare riferimento a una variabile tramite il suo nome come una stringa in javascript? Come sarebbe stato fatto?


gli array non sono variabili, se usi un array come argomento di una funzione, l'interprete JS userà un puntatore al tuo array. Nella programmazione l'uso di certi termini è preciso, e quello che chiedi ha poco significato
Mister Jojo

Risposte:


147

Non esiste un'unica soluzione per questo (beh, c'è eval, ma non consideriamolo seriamente). È possibile accedere dinamicamente ad alcune variabili globali tramite window, ma ciò non funziona per le variabili locali a una funzione. Le variabili globali che non diventano una proprietà di windowsono variabili definite con lete const, ed classes.

C'è quasi sempre una soluzione migliore rispetto all'utilizzo di variabili variabili! Invece dovresti guardare le strutture dei dati e scegliere quella giusta per il tuo problema.

Se hai un insieme fisso di nomi, come

// BAD
var foo = 42;
var bar = 21;

var key = 'foo';
console.log(eval(key));

memorizzare quei nomi / valori come proprietà di un oggetto e utilizzare la notazione delle parentesi per cercarli dinamicamente:

// GOOD
var obj = {
  foo: 42,
  bar: 21,
};

var key = 'foo';
console.log(obj[key]);

In ES2015 + è ancora più facile farlo per le variabili esistenti usando la notazione concisa delle proprietà :

// GOOD
var foo = 42;
var bar = 21;
var obj = {foo, bar};

var key = 'foo';
console.log(obj[key]);


Se hai variabili numerate "consecutivamente", come

// BAD
var foo1 = 'foo';
var foo2 = 'bar';
var foo3 = 'baz';

var index = 1;
console.log(eval('foo' + index));

allora dovresti invece usare un array e usare semplicemente l'indice per accedere al valore corrispondente:

// GOOD
var foos = ['foo', 'bar', 'baz'];
var index = 1;
console.log(foos[index - 1]);


Esempi per la definizione di più valori: var x = 1; var x, y = 2; x = 1; var x = 1, y = 2; var x = xx = 1; var y = x + x;
Amin Maleki

42

Se hai un disperato bisogno di farlo, puoi provare a usare eval ():

var data = "testVariable";
eval("var temp_" + data + "=123;");
alert(temp_testVariable);

O usando l'oggetto finestra:

var data = "testVariable";
window["temp_" + data] = 123;
alert(window["temp_" + data]);

http://www.hiteshagrawal.com/javascript/dynamic-variables-in-javascript


evalnon è possibile creare variabili locali in modalità rigorosa. Tuttavia, una chiamata indiretta può creare variabili globali.
Oriol

4

Per fare riferimento a una variabile in javascript con solo una stringa, puoi usare

window['your_variable_name']

È possibile impostare e fare riferimento a variabili e anche a oggetti nelle variabili.


4

A differenza di PHP, JavaScript non offre accesso all'array globals (che contiene riferimenti a tutti i nomi di variabili attualmente dichiarati). Pertanto, JavaScript non offre supporto nativo per le variabili variabili. Tuttavia, è possibile emulare questa funzionalità purché si definiscano tutte le variabili come parte di un array o di un oggetto. Questo a sua volta creerà un array gloabls per te. Ad esempio, invece di dichiarare la variabile hellonell'ambito globale in questo modo:

var hello = 'hello world';

incapsuliamolo all'interno di un oggetto. Chiameremo quell'oggetto vv (variabili variabili):

var vv = {
    'hello': 'hello world',
    //Other variable variables come here.
},
referToHello = 'hello';

Ora possiamo fare riferimento alla variabile tramite il suo indice, e poiché gli indici di array possono essere forniti utilizzando una variabile, stiamo di fatto facendo uso di una variabile variabile:

console.log(vv[referToHello]); //Output: hello world

La risposta alla tua domanda

Applichiamo questo al codice che hai fornito nella domanda originale:

    var vv = {
        'x': 'variable',
        'variable': 'hello world!'
    };
    console.log(vv[vv['x']]); //Displays "hello, world!"

Un utilizzo pratico

Mentre il codice precedente potrebbe sembrare ridicolmente ingombrante e poco pratico, ci sono usi pratici per le variabili variabili in JavaScript che utilizzano questo tipo di incapsulamento. Nell'esempio seguente usiamo lo stesso concetto per ottenere l'ID di un numero indefinito di elementi HTML.

var elementIds = [],
        elements = ['message','fillOrStroke','sizePicker','colorPicker']; //The items in this array could be defined automatically via an input, database query, event, etc.
        elements.forEach( (element) => {
            elementIds[element] = document.getElementById(element);
        });

Questo esempio dichiara le variabili variabili (chiavi in elementIds) in base all'ID di ogni elemento e assegnerà il nodo di detto elemento come valore di ciascuna variabile. E poiché l'utilizzo di variabili globali in JavaScript è generalmente sconsigliato dare alle variabili variabili un ambito univoco (in questo caso, dichiararle all'interno elementIdsdell'array) non è solo pulito, ma anche più responsabile.


2

Certo che puoi, ma non farlo. Le variabili devono essere globali.

var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])

2
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);

0

Puoi usare la eval(str)funzione JavaScript .

Ciò che questa funzione fa è convertire la stringa fornita in codice JS, quindi la esegue.

Per esempio:

eval("console.log('hello world')"); // Logs hello world

Quindi, per usarlo come variabile variabile, puoi fare quanto segue:

var a = "hello";
var hello = "world";
console.log(a + " " + eval(a)); // Logs hello world

Questo produrrà lo stesso identico output di:

console.log(a + " " + hello); // Logs hello world

(L'esempio è tratto dal manuale PHP sulle variabili variabili .)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.