Zmienne „zmienne” w JavaScript?

101

Wiem, że w PHP można mieć zmienne „zmienne”. Na przykład

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

Czy można odwoływać się do zmiennej przez jej nazwę jako ciąg znaków w javascript? Jak by to zrobiono?

Sznurowadło1291
źródło
tablice nie są zmiennymi, jeśli używasz tablicy jako argumentu funkcji, interpreter JS użyje wskaźnika do twojej tablicy. W programowaniu użycie pewnych terminów jest precyzyjne, a to, o co prosisz, ma bardzo małe znaczenie
Mister Jojo

Odpowiedzi:

147

Nie ma na to jednego rozwiązania (cóż, jest eval, ale nie rozważajmy tego poważnie). Możliwe jest dynamiczne uzyskiwanie dostępu do niektórych zmiennych globalnych przez window, ale to nie działa w przypadku zmiennych lokalnych dla funkcji. Zmienne globalne, które nie stają się właściwością, windowto zmienne zdefiniowane za pomocą leti constoraz classes.

Prawie zawsze istnieje lepsze rozwiązanie niż używanie zmiennych zmiennych! Zamiast tego powinieneś przyjrzeć się strukturom danych i wybrać odpowiednią dla swojego problemu.

Jeśli masz ustalony zestaw nazw, na przykład

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

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

zapisz te nazwy / wartości jako właściwości obiektu i użyj notacji w nawiasach, aby wyszukać je dynamicznie:

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

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

W ES2015 + jest to jeszcze łatwiejsze do zrobienia dla istniejących zmiennych przy użyciu zwięzłej notacji właściwości :

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

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


Jeśli masz zmienne numerowane kolejno, takie jak

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

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

to powinieneś zamiast tego użyć tablicy i po prostu użyć indeksu, aby uzyskać dostęp do odpowiedniej wartości:

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

Felix Kling
źródło
Przykłady definiowania wielu wartości: 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

Jeśli jesteś zdesperowany, aby to zrobić, możesz spróbować użyć eval ():

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

Lub używając obiektu window:

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

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

Masterbuddha
źródło
evalnie może tworzyć zmiennych lokalnych w trybie ścisłym. Jednak wywołanie pośrednie może tworzyć zmienne globalne.
Oriol
4

Aby odwołać się do zmiennej w javascript tylko za pomocą ciągu znaków, możesz użyć

window['your_variable_name']

Możesz ustawiać i odwoływać się do zmiennych oraz obiektów w zmiennych.

Awesomeness01
źródło
4

W przeciwieństwie do PHP, JavaScript nie oferuje dostępu do tablicy globals (która zawiera odniesienia do wszystkich aktualnie zadeklarowanych nazw zmiennych). W związku z tym JavaScript nie oferuje natywnej obsługi zmiennych zmiennych. Możesz jednak emulować tę funkcję, o ile zdefiniujesz wszystkie zmienne jako część tablicy lub obiektu. To z kolei stworzy dla ciebie tablicę gloabls. Na przykład zamiast deklarować zmienną hellow zakresie globalnym w następujący sposób:

var hello = 'hello world';

zamknijmy go wewnątrz obiektu. Nazwiemy ten obiekt vv (zmienne zmienne):

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

Teraz możemy odwołać się do zmiennej za pomocą jej indeksu, a ponieważ indeksy tablic mogą być dostarczane za pomocą zmiennej, de facto używamy zmiennej zmiennej:

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

Odpowiedź na Twoje pytanie

Zastosujmy to do kodu podanego w pierwotnym pytaniu:

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

Praktyczne zastosowanie

Chociaż poprzedni kod może wydawać się absurdalnie uciążliwy i niepraktyczny, istnieją praktyczne zastosowania zmiennych zmiennych w JavaScript używających tego typu hermetyzacji. W poniższym przykładzie używamy tej samej koncepcji, aby uzyskać identyfikator niezdefiniowanej liczby elementów 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);
        });

Ten przykład deklaruje zmienne zmienne (klucze elementIds) na podstawie identyfikatora każdego elementu i przypisze węzeł wspomnianego elementu jako wartość każdej zmiennej. A ponieważ używanie zmiennych globalnych w JavaScript jest generalnie odradzane, nadawanie zmiennym zmiennym unikalnego zakresu (w tym przypadku zadeklarowanie ich wewnątrz elementIdstablicy) jest nie tylko schludne, ale także bardziej odpowiedzialne.

Nadav
źródło
2

Oczywiście, że możesz, ale nie rób tego. Zmienne muszą być globalne.

var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
Konrad Borowski
źródło
2
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);
lkdhruw
źródło
-1

Możesz użyć JavaScript eval(str) funkcji .

Ta funkcja konwertuje dostarczony ciąg na kod JS, a następnie wykonuje go.

Na przykład:

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

Aby użyć go jako zmiennej zmiennej, możesz wykonać następujące czynności:

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

To da dokładnie taki sam wynik jak:

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

(Przykład pochodzi z podręcznika PHP na temat zmiennych zmiennych ).

Abraham Murciano Benzadon
źródło