提问人:Finbarr 提问时间:2/25/2011 最后编辑:VLAZFinbarr 更新时间:3/2/2023 访问量:705173
在 JavaScript 中使用动态变量名称 [duplicate]
Use dynamic variable names in JavaScript [duplicate]
问:
在PHP中,你可以做这样令人惊奇/可怕的事情:
$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1
有没有办法用 Javascript 做这样的事情?
例如,如果我有一个,我可以得到一个带有名称的变量的引用吗?var name = 'the name of the variable';
name
答:
您可以使用 window 对象来获取它。
window['myVar']
window
具有对正在使用的所有全局变量和全局函数的引用。
评论
window
state
eval
是一种选择。
var a = 1;
var name = 'a';
document.write(eval(name)); // 1
警告:请注意,如果您不知道自己在做什么,则不建议使用该功能,因为它会带来多个安全问题。除非绝对必要,否则使用其他东西。有关更多信息,请参见 MDN 页面的 eval 页面。eval()
评论
由于 ECMA-/Javascript 是关于 和(它们也是某种对象),因此每个变量都存储在称为 Variable- (或者如果是函数,则为 Activation 对象)中。Objects
Contexts
因此,如果您创建如下变量:
var a = 1,
b = 2,
c = 3;
在全局作用域(= NO 函数上下文)中,将这些变量隐式写入全局对象(在浏览器中为 =)。window
可以使用“点”或“括号”表示法访问这些内容:
var name = window.a;
或
var name = window['a'];
这仅适用于此特定实例中的全局对象,因为全局对象的变量对象是对象本身。在函数的 Context 中,您无权直接访问 Activation 对象。例如:window
function foobar() {
this.a = 1;
this.b = 2;
var name = window['a']; // === undefined
console.log(name);
name = this['a']; // === 1
console.log(name);
}
new foobar();
new
创建自定义对象 (Context) 的新实例。如果没有函数的范围,也会是 (=window)。此示例将分别发出警报和警报。如果我们用以下方法替换:new
global
undefined
1
this.a = 1; this.b = 2
var a = 1,
b = 2;
两个警报输出都是未定义的。在这种情况下,变量 and 将存储在 激活对象中,我们无法访问该对象(当然,我们可以通过调用 和 直接访问它们)。a
b
foobar
a
b
评论
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);
试试这个...
他们的意思是不,你不能。 没有办法完成它。 所以你有可能做这样的事情
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 中实现的 create 函数。
评论
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="head"
<head>
在 Javascript 中,您可以使用所有属性都是键值对这一事实。jAndy 已经提到过这一点,但我认为他的回答并没有说明如何利用它。
通常,您不是尝试创建变量来保存变量名称,而是尝试生成变量名称,然后使用它们。PHP 使用符号来做到这一点,但 Javascript 不需要,因为属性键可以与数组键互换。$$var
var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);
给 123。通常你想构造变量,这就是为什么有间接的原因,所以你也可以反过来做。
var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);
评论
只是不知道一个糟糕的答案会得到这么多选票。答案很简单,但你让它变得复杂。
// 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
undefined
new
changeProperty(propertyName) { this[propertyName] = 1; }
changeProperty("bar")
changeProperty("baz")
这是一个例子:
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 对象的属性。
如果你不想使用像 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);
评论
2019
TL;博士
eval
运算符可以在它调用的上下文中运行字符串表达式,并从该上下文返回变量;literal object
理论上可以通过 write: 来做到这一点,但它被定义阻止了。{[varName]}
所以我遇到了这个问题,这里的每个人都只是玩弄,没有带来真正的解决方案。但@Axel海德有一个很好的方法。
解决方案是 .
几乎大多数被遗忘的操作员。(认为大多数是eval
with()
)
eval
运算符可以在它调用的上下文中动态运行 expression。并返回该表达式的结果。我们可以使用它在函数的上下文中动态返回变量的值。
例:
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 }`
评论
使用对象也很棒。
var a=123
var b=234
var temp = {"a":a,"b":b}
console.log(temp["a"],temp["b"]);
虽然这有一个公认的答案,但我想补充一个意见:
在 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
const vars = { t, m, b }; console.log(vars['b'])
eval
let
const
window
var
function
对于那些需要导出动态命名变量的用户来说,这是一种替代方法
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];
评论
import
export
最好使用创建命名空间并在其中声明一个变量,而不是将其添加到全局对象中。我们还可以创建一个函数来获取和设置值
请参阅以下代码片段:
//creating a namespace in which all the variables will be defined.
var myObjects={};
//function that will set the name property in the myObjects namespace
function setName(val){
myObjects.Name=val;
}
//function that will return the name property in the myObjects namespace
function getName(){
return myObjects.Name;
}
//now we can use it like:
setName("kevin");
var x = getName();
var y = x;
console.log(y) //"kevin"
var z = "y";
console.log(z); //"y"
console.log(eval(z)); //"kevin"
通过这种类似的方式,我们可以声明和使用多个变量。虽然这将增加代码行,但代码将更健壮,更不容易出错。
这将完全执行您在 php 中所做的操作:
var a = 1;
var b = 2;
var ccc = 3;
var name = 'a';
console.log( window[name] ); // 1
评论
最简单的解决方案:创建一个对象数组,每个对象都有两个字段(variableName,variableValue)
let allVariables = [];
for (let i = 0; i < 5; i++)
allVariables.push({ variableName: 'variable' + i, variableValue: i * 10 });
for (let i = 0; i < allVariables.length; i++)
console.log(allVariables[i].variableName + ' is ' + allVariables[i].variableValue);
输出:
variable0 is 0
variable1 is 10
variable2 is 20
variable3 is 30
variable4 is 40
console.log(allVariables) json :
[
{
"variableName": "variable0",
"variableValue": 0
},
{
"variableName": "variable1",
"variableValue": 10
},
{
"variableName": "variable2",
"variableValue": 20
},
{
"variableName": "variable3",
"variableValue": 30
},
{
"variableName": "variable4",
"variableValue": 40
}
]
评论