"Переменные" переменные в Javascript?

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

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

возможно ли это в javascript? Как это сделать?

7 ответов


для этого нет единого решения (ну, есть 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]);

если вы" последовательно " пронумерованы переменные, такие как

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

Если вы отчаянно хотите это сделать, вы можете попробовать использовать eval ():

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

или с помощью объекта window:

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

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


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

window['your_variable_name']

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


вы можете использовать JavaScript eval(str)


в отличие от PHP, JavaScript не предлагает доступ к массиву globals (который содержит ссылки на все имена переменных, объявленные в настоящее время). Таким образом, 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!"

A Практическое Использование

хотя предыдущий код может показаться смехотворно громоздким и непрактичным, в 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 array) не только аккуратный, но и более ответственный.


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

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

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