Я знаю, что в 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));
Если вы отчаянно хотите сделать это, вы можете попробовать использовать 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
Чтобы ссылаться на переменную в javascript только с помощью строки, вы можете использовать
window['your_variable_name']
Вы можете устанавливать и ссылаться на переменные и объекты в переменных тоже.
Конечно, можете, но не надо. Переменные должны быть глобальными.
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"]);
Вы можете использовать функцию 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 по переменным переменным.)
В отличие от PHP, JavaScript не предлагает доступ к массиву globals (который содержит ссылки на все объявленные имена переменных). Таким образом, JavaScript не предлагает встроенную поддержку переменных переменных. Вы можете, однако, эмулировать эту функцию, пока вы определяете все свои переменные как часть массива или объекта. Это, в свою очередь, создаст для вас массив злодеев. Например, вместо объявления переменной 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 с использованием такого типа инкапсуляции. В приведенном ниже примере мы используем ту же концепцию, чтобы получить идентификатор undefined количества элементов 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
) на основе идентификатора каждого элемента и присваиваются node указанного элемента как значение каждой переменной. И поскольку использование глобальных переменных в JavaScript обычно не рекомендуется, чтобы переменные переменные были уникальной областью (в этом случае, объявив их внутри массива elementIds
), не только аккуратно, но и более ответственны.
Мы можем использовать это.
var objectName[key]{
'someDataName':'thatData',
'someOtherDataName':'thisData'
}
Если вы хотите получить значение значения, чтобы использовать цикл
for(key in objectName){
objectName[key].someDataName;
objectName[key].someOtherDataName;
}