Variabel "Variabel" di Javascript?

101

Saya tahu itu mungkin di PHP untuk memiliki variabel "variabel". Sebagai contoh

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

Apakah mungkin untuk merujuk ke variabel dengan namanya sebagai string di javascript? Bagaimana melakukannya?

ShoeLace 1291
sumber
array bukanlah variabel, jika Anda menggunakan array sebagai argumen fungsi, interpreter JS akan menggunakan pointer ke array Anda. Dalam pemrograman, penggunaan istilah-istilah tertentu adalah tepat, dan apa yang Anda minta hanya memiliki sedikit arti
Tuan Jojo

Jawaban:

147

Tidak ada solusi tunggal untuk ini (yah, ada eval, tapi mari kita tidak mempertimbangkannya dengan serius). Dimungkinkan untuk mengakses beberapa variabel global secara dinamis melalui window, tetapi itu tidak berfungsi untuk variabel lokal ke suatu fungsi. Variabel global yang tidak menjadi properti windowadalah variabel yang ditentukan dengan letdan const, dan classes.

Hampir selalu ada solusi yang lebih baik daripada menggunakan variabel variabel! Sebaliknya, Anda harus melihat struktur data dan memilih yang tepat untuk masalah Anda.

Jika Anda memiliki sekumpulan nama tetap, seperti

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

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

simpan nama / nilai tersebut sebagai properti dari suatu objek dan gunakan notasi braket untuk mencarinya secara dinamis:

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

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

Di ES2015 + bahkan lebih mudah melakukan ini untuk variabel yang ada menggunakan notasi properti ringkas :

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

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


Jika Anda memiliki variabel bernomor "berurutan", seperti

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

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

maka Anda harus menggunakan array dan cukup gunakan indeks untuk mengakses nilai yang sesuai:

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

Felix Kling
sumber
Contoh untuk menentukan beberapa nilai: 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

Jika Anda sangat ingin melakukan ini, Anda dapat mencoba menggunakan eval ():

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

Atau menggunakan objek jendela:

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

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

Masterbuddha
sumber
evaltidak dapat membuat variabel lokal dalam mode ketat. Panggilan tidak langsung dapat membuat variabel global.
Oriol
4

Untuk mereferensikan variabel dalam javascript dengan hanya sebuah string, Anda dapat menggunakan

window['your_variable_name']

Anda dapat mengatur dan mereferensikan variabel, dan objek dalam variabel juga.

Keangkeran01
sumber
4

Tidak seperti PHP, JavaScript tidak menawarkan akses ke larik global (yang berisi referensi ke semua nama variabel yang saat ini dideklarasikan). Karena itu, JavaScript tidak menawarkan dukungan asli untuk variabel variabel. Namun, Anda dapat meniru fitur ini selama Anda mendefinisikan semua variabel Anda sebagai bagian dari larik atau objek. Ini pada gilirannya akan membuat array gloabls untuk Anda. Misalnya, daripada mendeklarasikan variabel hellodalam cakupan global seperti ini:

var hello = 'hello world';

mari kita merangkumnya di dalam sebuah objek. Kami akan memanggil objek itu vv (variabel variabel):

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

Sekarang kita dapat merujuk ke variabel dengan indeksnya, dan karena indeks array dapat disediakan menggunakan variabel, kita secara de facto menggunakan variabel variabel:

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

Jawaban atas Pertanyaan Anda

Mari terapkan ini ke kode yang Anda berikan di pertanyaan awal:

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

Penggunaan Praktis

Meskipun kode sebelumnya mungkin tampak sangat rumit dan tidak praktis, ada penggunaan praktis untuk variabel variabel di JavaScript menggunakan jenis enkapsulasi ini. Dalam contoh di bawah ini kami menggunakan konsep yang sama untuk mendapatkan ID dari sejumlah elemen HTML yang tidak ditentukan.

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

Contoh ini mendeklarasikan variabel variabel (key in elementIds) berdasarkan ID dari setiap elemen, dan akan menetapkan node dari elemen tersebut sebagai nilai dari setiap variabel. Dan karena menggunakan variabel global dalam JavaScript umumnya tidak disarankan untuk memberikan variabel variabel Anda ruang lingkup yang unik (dalam hal ini, mendeklarasikannya di dalam elementIdsarray) tidak hanya rapi, tetapi juga lebih bertanggung jawab.

Nadav
sumber
2

Tentu saja bisa, tapi jangan. Variabel harus global.

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

Anda dapat menggunakan eval(str)fungsi JavaScript .

Apa yang dilakukan fungsi ini adalah mengubah string yang diberikan menjadi kode JS, lalu menjalankannya.

Sebagai contoh:

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

Jadi untuk menggunakannya sebagai variabel variabel, Anda dapat melakukan hal berikut:

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

Ini akan menghasilkan keluaran yang sama persis dengan:

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

(Contoh diambil dari manual PHP tentang variabel variabel .)

Abraham Murciano Benzadon
sumber