«Переменные» переменные в Javascript?

101

Я знаю, что в PHP возможно иметь «переменные» переменные. Например

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

Можно ли ссылаться на переменную по ее имени в виде строки в javascript? Как бы это сделать?

Шнурки для обуви1291
источник
массивы не являются переменными, если вы используете массив в качестве аргумента функции, интерпретатор JS будет использовать указатель на ваш массив. В программировании использование определенных терминов является точным, и то, что вы просите, имеет очень мало значения
Мистер Джоджо

Ответы:

148

Единого решения для этого нет (ну, есть 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; вар х = хх = 1; вар у = х + х;
Амин Малеки
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не может создавать локальные переменные в строгом режиме. Однако косвенный вызов может создавать глобальные переменные.
Oriol
5

В отличие от 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);
        });

В этом примере объявляются переменные переменные (ключи in elementIds) на основе идентификатора каждого элемента и назначается узел указанного элемента как значение каждой переменной. А поскольку использование глобальных переменных в JavaScript обычно не рекомендуется, придание вашим переменным переменных уникальной области видимости (в данном случае объявление их внутри elementIdsмассива) не только аккуратно, но и более ответственно.

Надав
источник
4

Чтобы ссылаться на переменную в javascript только с помощью строки, вы можете использовать

window['your_variable_name']

Вы можете устанавливать и ссылаться на переменные, а также на объекты в переменных.

Превосходство01
источник
2
var vars = {};
var var_name = "str";
vars[var_name] = "working";
console.log(vars["str"]);
lkdhruw
источник
2

Конечно можно, но не надо. Переменные должны быть глобальными.

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

Конрад Боровски
источник
-1

Вы можете использовать eval(str)функцию JavaScript .

Эта функция преобразует предоставленную строку в код 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 по переменным переменным .)

Авраам Мурчиано Бензадон
источник