"Variable" Variablen in Javascript?

101

Ich weiß, dass es in PHP möglich ist, "variable" Variablen zu haben. Beispielsweise

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

Ist es möglich, eine Variable mit ihrem Namen als Zeichenfolge in Javascript zu bezeichnen? Wie würde es gemacht werden?

ShoeLace1291
quelle
Arrays sind keine Variablen. Wenn Sie ein Array als Funktionsargument verwenden, verwendet der JS-Interpreter einen Zeiger auf Ihr Array. Bei der Programmierung ist die Verwendung bestimmter Begriffe präzise, ​​und was Sie verlangen, hat nur eine sehr geringe Bedeutung
Herr Jojo

Antworten:

147

Es gibt keine einzige Lösung dafür (nun ja eval, aber wir sollten das nicht ernsthaft in Betracht ziehen). Es ist möglich, dynamisch über auf einige globale Variablen zuzugreifen window, dies funktioniert jedoch nicht für lokale Variablen einer Funktion. Globale Variablen, deren Eigenschaft nicht wird , windowsind Variablen, die mit letund constund classes definiert sind.

Es gibt fast immer eine bessere Lösung als die Verwendung variabler Variablen! Stattdessen sollten Sie sich Datenstrukturen ansehen und die richtige für Ihr Problem auswählen.

Wenn Sie einen festen Satz von Namen haben, wie z

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

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

Speichern Sie diese Namen / Werte als Eigenschaften eines Objekts und verwenden Sie die Klammernotation , um sie dynamisch nachzuschlagen:

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

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

In ES2015 + ist dies für vorhandene Variablen mithilfe der präzisen Eigenschaftsnotation noch einfacher :

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

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


Wenn Sie "fortlaufend" nummerierte Variablen haben, wie z

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

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

Dann sollten Sie stattdessen ein Array verwenden und einfach den Index verwenden, um auf den entsprechenden Wert zuzugreifen:

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

Felix Kling
quelle
Beispiele zum Definieren mehrerer Werte: 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

Wenn Sie dies unbedingt tun möchten, können Sie entweder eval () verwenden:

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

Oder mit dem Fensterobjekt:

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

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

Masterbuddha
quelle
evalIm strengen Modus können keine lokalen Variablen erstellt werden. Ein indirekter Aufruf kann jedoch globale Variablen erstellen.
Oriol
4

Sie können eine Variable in Javascript nur mit einer Zeichenfolge referenzieren

window['your_variable_name']

Sie können Variablen und Objekte in Variablen auch festlegen und referenzieren.

Awesomeness01
quelle
4

Im Gegensatz zu PHP bietet JavaScript keinen Zugriff auf das globale Array (das Verweise auf alle derzeit deklarierten Variablennamen enthält). Daher bietet JavaScript keine native Unterstützung für variable Variablen. Sie können diese Funktion jedoch emulieren, solange Sie alle Ihre Variablen als Teil eines Arrays oder eines Objekts definieren. Dadurch wird wiederum ein gloabls-Array für Sie erstellt. Anstatt die Variable helloim globalen Bereich wie folgt zu deklarieren :

var hello = 'hello world';

Lassen Sie es uns in ein Objekt einkapseln. Wir nennen das Objekt vv (variable Variablen):

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

Jetzt können wir die Variable anhand ihres Index referenzieren, und da Array-Indizes mithilfe einer Variablen bereitgestellt werden können, verwenden wir de facto eine Variablenvariable:

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

Die Antwort auf Ihre Frage

Wenden wir dies auf den Code an, den Sie in der ursprünglichen Frage angegeben haben:

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

Eine praktische Anwendung

Während der vorherige Code lächerlich umständlich und unpraktisch erscheint, gibt es praktische Verwendungen für variable Variablen in JavaScript, die diese Art der Kapselung verwenden. Im folgenden Beispiel verwenden wir dasselbe Konzept, um die ID einer undefinierten Anzahl von HTML-Elementen abzurufen.

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

In diesem Beispiel werden Variablenvariablen (Schlüssel eingeben elementIds) basierend auf der ID jedes Elements deklariert und der Knoten dieses Elements als Wert jeder Variablen zugewiesen. Und da die Verwendung globaler Variablen in JavaScript generell elementIdsnicht empfohlen wird, ist es nicht nur ordentlich, Ihren Variablenvariablen einen eindeutigen Bereich zu geben (in diesem Fall, sie innerhalb des Arrays zu deklarieren ), sondern auch verantwortungsbewusster.

Nadav
quelle
2

Natürlich kannst du, aber nicht. Die Variablen müssen global sein.

var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
Konrad Borowski
quelle
2
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);
lkdhruw
quelle
0

Sie können die JavaScript- eval(str)Funktion verwenden.

Diese Funktion konvertiert die bereitgestellte Zeichenfolge in JS-Code und führt sie dann aus.

Beispielsweise:

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

Um es als variable Variable zu verwenden, können Sie Folgendes tun:

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

Dies erzeugt genau die gleiche Ausgabe wie:

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

(Das Beispiel stammt aus dem PHP-Handbuch zu variablen Variablen .)

Abraham Murciano Benzadon
quelle