"Змінні" змінні у Javascript?


101

Я знаю, що в PHP можливо мати "змінні" змінні. Наприклад

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

Чи можна посилатися на змінну за її назвою як рядок у javascript? Як би це було зроблено?


масиви не є змінними, якщо ви використовуєте масив як аргумент функції, інтерпретатор JS буде використовувати вказівник на ваш масив. У програмуванні використання певних термінів є точним, а те, що ви просите, має дуже мало значення
Містер Джоджо

Відповіді:


147

Єдиного рішення для цього немає (ну, є eval, але давайте серйозно не розглядати це). Можна отримати доступ до деяких глобальних змінних динамічно через window, але це не працює для змінних, локальних для функції. Глобальні змінні, які не стають властивістю, - windowце змінні, визначені за допомогою letі const, та classes.

Майже завжди є краще рішення, ніж використання змінних змінних! Натомість вам слід переглянути структуру даних і вибрати правильну для вашої проблеми.

Якщо у вас є фіксований набір імен, наприклад

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

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

збережіть ці імена / значення як властивості об'єкта та використовуйте позначення дужок, щоб динамічно їх шукати:

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

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

У ES2015 + це ще простіше зробити для існуючих змінних, використовуючи стислі позначення властивостей :

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

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


Якщо у вас є "послідовно" пронумеровані змінні, наприклад

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

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

то вам слід використовувати масив замість цього та просто використовувати індекс для доступу до відповідного значення:

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


Приклади для визначення кількох значень: var x = 1; var x, y = 2; х = 1; var x = 1, y = 2; var x = xx = 1; var y = x + x;
Амін

42

Якщо ви відчайдушно робите це, ви можете спробувати скористатися eval ():

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

Або використовуючи об’єкт вікна:

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

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


evalне може створити локальні змінні в суворому режимі. Однак непрямий виклик може створювати глобальні змінні.
Оріол

4

Для посилання на змінну в JavaScript лише з рядком, ви можете використовувати

window['your_variable_name']

Ви також можете встановлювати та посилати змінні, а також об'єкти в змінних.


4

На відміну від PHP, JavaScript не пропонує доступ до глобального масиву (який містить посилання на всі задекларовані в даний час імена). Як такий, JavaScript не пропонує вбудовану підтримку змінних змінних. Однак ви можете імітувати цю функцію до тих пір, поки не визначите всі змінні як частина масиву чи об'єкта. Це, в свою чергу, створить для вас масив gloabls. Наприклад, замість того, щоб оголосити змінну helloв глобальній області таким чином:

var hello = 'hello world';

давайте інкапсулюємо його всередині об'єкта. Ми будемо називати цей об'єкт vv (змінні змінні):

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

Тепер ми можемо звернутися до змінної за її індексом, і оскільки індекси масиву можна надати за допомогою змінної, ми фактично використовуємо змінну змінної:

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

Відповідь на ваше запитання

Давайте застосуємо це до коду, який ви вказали в оригінальному запитанні:

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

Практичне використання

Хоча попередній код може виглядати смішно громіздким і непрактичним, у практичному використанні змінних змінних в JavaScript є практичне використання, використовуючи цей тип інкапсуляції. У наведеному нижче прикладі ми використовуємо ту саму концепцію, щоб отримати ідентифікатор невизначеної кількості елементів 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);
        });

Цей приклад оголошує змінні змінних (ключі в elementIds) на основі ідентифікатора кожного елемента і призначить вузол згаданого елемента як значення кожної змінної. А оскільки використання глобальних змінних у JavaScript, як правило, не рекомендує надавати змінним змінним унікальний обсяг (у цьому випадку, оголошуючи їх всередині elementIdsмасиву), є не лише акуратним, але й більш відповідальним.


2

Звичайно, можна, але ні. Змінні повинні бути глобальними.

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

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

0

Ви можете використовувати функцію JavaScript eval(str).

Ця функція - це перетворити рядок, наданий у JS-код, а потім виконати його.

Наприклад:

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

Отже, щоб використовувати його як змінну, можна зробити наступне:

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

Це дасть такий самий вихід, як:

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

(Приклад взято з посібника PHP щодо змінних змінних .)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.