Javascript'teki "değişken" değişkenler?


101

PHP'de "değişken" değişkenlere sahip olmanın mümkün olduğunu biliyorum. Örneğin

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

JavaScript'te bir değişkene adıyla bir dizge olarak başvurmak mümkün müdür? Nasıl yapılır?


diziler değişken değildir, işlev argümanı olarak bir dizi kullanırsanız, JS yorumlayıcısı diziniz için bir işaretçi kullanır. Programlamada belirli terimlerin kullanımı kesindir ve istediğiniz şeyin çok az anlamı vardır
Bay Jojo

Yanıtlar:


148

Bunun için tek bir çözüm yok (evet, var evalama bunu ciddiye almayalım). Bazı global değişkenlere dinamik olarak erişmek mümkündür window, ancak bu, bir işleve yerel değişkenler için çalışmaz. Bir özelliği haline gelmeyen global değişkenler, ve , ve es windowile tanımlanan değişkenlerdir .letconstclass

Neredeyse her zaman değişken değişkenler kullanmaktan daha iyi bir çözüm vardır! Bunun yerine, veri yapılarına bakmalı ve sorununuz için doğru olanı seçmelisiniz.

Sabit isimleriniz varsa, örneğin

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

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

Bir özellikleri olarak bu ad / değerleri depolamak nesne ve kullanım ayraç bunları dinamik aramak için:

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

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

In ES2015 + o kullanarak mevcut değişkenler için bunu yapmak daha da kolay anlaşılır mülkiyet notasyonu :

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

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


"Art arda" numaralandırılmış değişkenleriniz varsa, örneğin

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

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

o zaman bunun yerine bir dizi kullanmanız ve karşılık gelen değere erişmek için dizini kullanmanız gerekir:

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


Birden çok değeri tanımlama örnekleri: 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

Bunu yapmak için çaresizseniz eval () kullanmayı deneyebilirsiniz:

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

Veya pencere nesnesini kullanarak:

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

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


evalkatı modda yerel değişkenler oluşturamaz. Dolaylı bir çağrı, yine de global değişkenler yaratabilir.
Oriol

5

PHP'den farklı olarak JavaScript, globals dizisine (şu anda bildirilen tüm değişken adlarına başvurular içeren) erişim sunmaz. Bu nedenle JavaScript, değişken değişkenler için yerel destek sunmaz. Bununla birlikte, tüm değişkenlerinizi bir dizinin veya bir nesnenin parçası olarak tanımladığınız sürece bu özelliği taklit edebilirsiniz. Bu da sizin için bir gloab dizisi oluşturacaktır. Örneğin, değişkeni hellogenel kapsamda şu şekilde bildirmek yerine :

var hello = 'hello world';

onu bir nesnenin içine sarmalayalım. Bu nesneye vv (değişken değişkenler) diyeceğiz:

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

Şimdi değişkeni indeksine göre ifade edebiliriz ve dizi indeksleri bir değişken kullanılarak sağlanabildiğinden, fiilen bir değişken değişkeni kullanıyoruz:

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

Sorunuzun Cevabı

Bunu, orijinal soruda sağladığınız koda uygulayalım:

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

Pratik Bir Kullanım

Önceki kod gülünç derecede külfetli ve pratik görünmese de, JavaScript'te bu tür kapsüllemeyi kullanan değişken değişkenlerin pratik kullanımları vardır. Aşağıdaki örnekte, tanımsız sayıda HTML öğesinin kimliğini elde etmek için aynı kavramı kullanıyoruz.

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

Bu örnek elementIds, her bir öğenin kimliğine bağlı olarak değişken değişkenleri (anahtarlar ) bildirir ve söz konusu öğenin düğümünü her değişkenin değeri olarak atar. Ve genel değişkenleri JavaScript'te kullanmak genellikle tavsiye elementIdsedilmediğinden , değişken değişkenlerinize benzersiz bir kapsam vermek (bu örnekte, onları dizi içinde bildirmek ) sadece düzgün değil, aynı zamanda daha sorumludur.


4

JavaScript'teki bir değişkene yalnızca bir dizeyle başvurmak için şunu kullanabilirsiniz:

window['your_variable_name']

Değişkenlerdeki değişkenleri ve nesneleri de ayarlayabilir ve bunlara referans verebilirsiniz.


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

2

Elbette yapabilirsin, ama yapma. Değişkenler global olmalıdır.

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


-1

JavaScript'i kullanabilirsiniz eval(str) işlevini .

Bu işlevin yaptığı şey, sağlanan dizeyi JS koduna dönüştürür ve ardından çalıştırır.

Örneğin:

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

Yani onu değişken değişken olarak kullanmak için aşağıdakileri yapabilirsiniz:

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

Bu, aşağıdakilerle tam olarak aynı çıktıyı üretecektir:

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

(Örnek, değişken değişkenlerle ilgili PHP kılavuzundan alınmıştır .)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.