Я знаю, что в PHP возможно иметь «переменные» переменные. Например
$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"
Можно ли ссылаться на переменную по ее имени в виде строки в javascript? Как бы это сделать?
Я знаю, что в PHP возможно иметь «переменные» переменные. Например
$x = "variable";
$$x = "hello, world!";
echo $variable; // displays "hello, world!"
Можно ли ссылаться на переменную по ее имени в виде строки в javascript? Как бы это сделать?
Ответы:
Единого решения для этого нет (ну, есть eval
, но не будем это всерьез рассматривать). Можно получить доступ к некоторым глобальным переменным динамически window
, но это не работает для переменных, локальных для функции. Глобальные переменные, которые не становятся свойством, - window
это переменные, определенные с помощью let
и const
, и class
es.
Почти всегда есть лучшее решение, чем использование переменных переменных! Вместо этого вам следует смотреть на структуры данных и выбирать подходящую для вашей проблемы.
Если у вас есть фиксированный набор имен, например
// 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]);
Если вы отчаянно пытаетесь это сделать, вы можете попробовать использовать 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
не может создавать локальные переменные в строгом режиме. Однако косвенный вызов может создавать глобальные переменные.
В отличие от 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
массива) не только аккуратно, но и более ответственно.
Чтобы ссылаться на переменную в javascript только с помощью строки, вы можете использовать
window['your_variable_name']
Вы можете устанавливать и ссылаться на переменные, а также на объекты в переменных.
Конечно можно, но не надо. Переменные должны быть глобальными.
var killingFunction = 'alert'
var killMeNow = 'please'
var please = 'You have been killed!'
this[killingFunction](this[killMeNow])
Вы можете использовать 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 по переменным переменным .)