在PHP中,您可以执行以下令人惊奇/可怕的事情:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
有没有办法用Java做类似的事情?
例如,如果我有一个名称,var name = 'the name of the variable';
可以得到对变量的引用name
吗?
在PHP中,您可以执行以下令人惊奇/可怕的事情:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
有没有办法用Java做类似的事情?
例如,如果我有一个名称,var name = 'the name of the variable';
可以得到对变量的引用name
吗?
Answers:
由于ECMA-/ JavaScript是所有关于Objects
和Contexts
(其也somekind的对象的),每个变量被存储在这样的被称为可变(或在功能的情况下,激活对象)。
因此,如果您创建这样的变量:
var a = 1,
b = 2,
c = 3;
在全局范围(= NO函数上下文)中,您将这些变量隐式写入全局对象(=window
在浏览器中)。
可以使用“点”或“括号”表示法来访问它们:
var name = window.a;
要么
var name = window['a'];
这仅适用于在这种特定情况下的全局对象,因为变量对象中的全局对象是window
对象本身。在函数的上下文中,您没有直接访问Activation Object的权限。例如:
function foobar() {
this.a = 1;
this.b = 2;
var name = window['a']; // === undefined
alert(name);
name = this['a']; // === 1
alert(name);
}
new foobar();
new
创建一个自定义对象(上下文)的新实例。没有new
该功能的范围也将是global
(= window)。此示例将分别警告undefined
和1
。如果我们替换this.a = 1; this.b = 2
为:
var a = 1,
b = 2;
两个警报输出均未定义。在这种情况下,变量a
和b
将存储在foobar
无法访问的激活对象中(我们可以通过调用a
和直接访问它们b
)。
eval
是一种选择。
var a = 1;
var name = 'a';
document.write(eval(name)); // 1
只是不知道一个糟糕的答案会得到这么多的选票。答案很简单,但您会使它变得复杂。
// If you want to get article_count
// var article_count = 1000;
var type = 'article';
this[type+'_count'] = 1000; // in a function we use "this";
alert(article_count);
this
”-如果您想以这种方式访问全局变量,最好是显式并使用window
对象,而不是this
。this
是模棱两可的。
this
或其他任何方式type
从示例中访问变量:function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')
将显示article
,而不是something else
。这就是“复杂答案”的解释。
这是一个例子:
for(var i=0; i<=3; i++) {
window['p'+i] = "hello " + i;
}
alert(p0); // hello 0
alert(p1); // hello 1
alert(p2); // hello 2
alert(p3); // hello 3
另一个例子 :
var myVariable = 'coco';
window[myVariable] = 'riko';
alert(coco); // display : riko
因此,myVariable的值“ coco ” 成为变量coco。
因为全局作用域中的所有变量都是Window对象的属性。
在Javascript中,您可以使用所有属性都是键值对的事实。jAndy已经提到了这一点,但是我不认为他的回答表明了如何利用它。
通常,您不是试图创建一个变量来保存变量名,而是试图生成变量名然后使用它们。PHP使用$$var
符号来做到这一点,但是Javascript不需要这样做,因为属性键可以与数组键互换。
var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);
给出123。通常您想要构造变量,这就是为什么存在间接的原因,因此您也可以采用其他方法。
var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);
2019年
eval
操作员可以在其调用的上下文中运行字符串表达式,并从该上下文返回变量; literal object
理论上可以通过write:来做到这一点{[varName]}
,但是它被定义阻塞了。因此,我遇到了这个问题,这里的每个人都在四处闲逛,没有提出真正的解决方案。但是@Axel Heider的接洽很好。
解决方法是eval
。几乎是最被遗忘的运营商。(以为是最多的with()
)
eval
运算符可以在其调用的上下文中动态运行表达式。并返回该表达式的结果。我们可以使用它在函数的上下文中动态返回变量的值。
例:
function exmaple1(){
var a = 1, b = 2, default = 3;
var name = 'a';
return eval(name)
}
example1() // return 1
function example2(option){
var a = 1, b = 2, defaultValue = 3;
switch(option){
case 'a': name = 'a'; break;
case 'b': name = 'b'; break;
default: name = 'defaultValue';
}
return eval (name);
}
example2('a') // return 1
example2('b') // return 2
example2() // return 3
请注意,我总是明确地编写表达式eval
将运行。为避免代码中出现不必要的意外。eval
非常强壮
但我确定你已经知道
顺便说一句,如果合法,我们可以literal object
用来捕获变量名和值,但是我们不能将计算出的属性名和属性值速记结合起来,可惜,这是无效的
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`
如果您不想使用诸如window或global(节点)之类的全局对象,则可以尝试如下操作:
var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';
console.log(obj['whatever']);
我需要动态绘制多个FormData,并且对象运行良好
var forms = {}
然后在需要创建表格数据的地方循环
forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);
对于需要导出动态命名变量的用户来说,这是一种替代方法
export {
[someVariable]: 'some value',
[anotherVariable]: 'another value',
}
// then.... import from another file like this:
import * as vars from './some-file'
另一种选择是简单地创建一个其键被动态命名的对象
const vars = { [someVariable]: 1, [otherVariable]: 2 };
// consume it like this
vars[someVariable];
他们的意思是不,你不能。没有办法完成它。所以有可能你可以做这样的事情
function create(obj, const){
// where obj is an object and const is a variable name
function const () {}
const.prototype.myProperty = property_value;
// .. more prototype
return new const();
}
具有与ECMAScript 5中实现的功能相同的创建功能。
eval
操作员
eval()在我的测试中不起作用。但是可以向DOM树添加新的JavaScript代码。因此,这是一个添加新变量的函数:
function createVariable(varName,varContent)
{
var scriptStr = "var "+varName+"= \""+varContent+"\""
var node_scriptCode = document.createTextNode( scriptStr )
var node_script = document.createElement("script");
node_script.type = "text/javascript"
node_script.appendChild(node_scriptCode);
var node_head = document.getElementsByTagName("head")[0]
node_head.appendChild(node_script);
}
createVariable("dynamicVar", "some content")
console.log(dynamicVar)
var node_head = document.getElementsByTagName("head")[0]
,而不是ID的,因为没有人给出了一个id="head"
以<head>
:-)
尽管这是一个可接受的答案,但我想补充一点:
在ES6中,使用let
不起作用:
/*this is NOT working*/
let t = "skyBlue",
m = "gold",
b = "tomato";
let color = window["b"];
console.log(color);
但是使用var
作品
/*this IS working*/
var t = "skyBlue",
m = "gold",
b = "tomato";
let color = window["b"];
console.log(color);
我希望这可能对某些人有用。
const vars = { t, m, b }; console.log(vars['b'])
。否则eval
也可以。