Använd dynamiska variabelnamn i JavaScript


I PHP kan du göra fantastiska/fruktansvärda saker som detta:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1

Finns det något sätt att göra något liknande med Javascript?

Till exempel, om jag har en var name='the name of the variable';, kan jag få en referens till variabeln med namnet name?

Svar #1

Eftersom ECMA-/Javascript handlar helt om Objects och Contexts (vilka också är någon form av Objekt), lagras varje variabel i ett så kallat Variable- (eller i fallet med en Funktion, Activation Object).

Så om du skapar variabler på det här sättet:

var a = 1,
    b = 2,
    c = 3;

I globalt omfång (= INGET funktionssammanhang) skriver du implicit dessa variabler till globala objektet (= window i en webbläsare).

Dessa kan nås genom att använda "punkt"- eller "hakparentes"-notationen:

var name = window.a;

eller

var name = window['a'];

Detta fungerar endast för det globala objektet i just detta fall, eftersom Variabelobjektet för Det Globala Objektet är window-objektet självt. Inom en funktions kontext har du inte direkt tillgång till Aktiveringsobjektet. Till exempel:

function foobar() {
  this.a = 1;
  this.b = 2;

  var name = window['a']; // === undefined
  console.log(name);
  name = this['a']; // === 1
  console.log(name);
}

new foobar();

new skapar en ny instans av ett självdefinierat objekt (kontext). Utan new skulle funktionen också ha global (=window) scope. Detta exempel skulle varna undefined och 1 respektive. Om vi skulle ersätta this.a=1; this.b=2 med:

var a = 1,
    b = 2;

Båda alert-utgångarna skulle vara odefinierade. I det scenariot skulle variablerna a och b lagras i aktiveringsobjektet från foobar, som vi inte kan komma åt (naturligtvis skulle vi kunna komma åt dem direkt genom att anropa a och b).

Svar #2

eval är ett alternativ.

var a = 1;
var name = 'a';

document.write(eval(name)); // 1

Varning: Observera att användning av eval()-funktionen inte rekommenderas om du inte vet vad du gör, eftersom den medför flera säkerhetsproblem. Använd något annat om det inte är absolut nödvändigt. Se MDN-sidan för eval för mer information.

Svar #3

Du kan använda fönsterobjektet för att komma åt det.

window['myVar']

window har en referens till alla globala variabler och globala funktioner som du använder.

Svar #4

Jag förstår bara inte varför ett dåligt svar får så många röster. Det är ett ganska enkelt svar men du gör det komplicerat.

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

Svar #5

Detta är ett exempel :

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

Ett annat exempel :

var myVariable = 'coco';
window[myVariable] = 'riko';

alert(coco); // display : riko

Så värdet "coco" av myVariable blir en variabel coco.

Eftersom alla variabler i den globala räckvidden är egenskaper hos Window-objektet.

Svar #6

a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);

Prova detta...

Svar #7

I Javascript kan du använda det faktum att alla egenskaper är nyckel-värde-par. jAndy nämnde redan detta men jag tror inte att hans svar visar hur det kan utnyttjas.

Vanligtvis försöker du inte skapa en variabel för att hålla ett variabelnamn utan försöker generera variabelnamn och sedan använda dem. PHP gör det med $$var-notation men Javascript behöver inte göra det eftersom egenskapsnycklar är utbytbara med arraynycklar.

var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);

ger 123. Vanligtvis vill du konstruera variabeln, vilket är anledningen till att det finns en indirektion så att du också kan göra det på motsatt sätt.

var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);

Svar #8

Om du inte vill använda ett globalt objekt som window eller global (node), kan du prova något som detta:

var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';

console.log(obj['whatever']);

Relaterade artiklar