Javascript使用变量作为对象名称

IT技术 javascript
2021-02-02 18:00:30

我想使用变量的值来访问对象。

假设我有一个名为 myobject 的对象。

我想用这个名称填充一个变量并使用该变量来访问该对象。

例子:

var objname = 'myobject';
{objname}.value = 'value';
6个回答

全球的:

myObject = { value: 0 };
anObjectName = "myObject";
this[anObjectName].value++;

console.log(this[anObjectName]);

全球:v2

var anObjectName = "myObject";
this[anObjectName] = "myvalue"

console.log(myObject)

本地:v1

(function() {
    var scope = this;

    if (scope != arguments.callee) {
        arguments.callee.call(arguments.callee);
        return false;
    }

    scope.myObject = { value: 0 };
    scope.anObjectName = "myObject";
    scope[scope.anObjectName].value++;

    console.log(scope.myObject.value);
})();

本地:v2

(function() {  
    var scope = this;

    scope.myObject = { value: 0 };
    scope.anObjectName = "myObject";
    scope[scope.anObjectName].value++;

    console.log(scope.myObject.value);    
}).call({});
@Shaz - 实际上两者都引用了相同的范围;-)(假设它们是在浏览器中执行的。) alert(this === window)
2021-03-23 18:00:30
@PeeHaa -在本地例如在设置一个变量window调用的对象objname,然后通过参考this...你可以代替windowthis在第二个例子中,一切都仍然坚持工作。:-)
2021-03-26 18:00:30
它可能不会污染全局范围,但它正在创建一个由函数的每次调用共享的对象。您的函数objname作为函数本身的属性而持有对于递归函数,它可能会失败。不确定如何在现实世界中使用它。
2021-03-29 18:00:30
@SeanVieira:看看更新的例子。希望这现在可以正常工作。
2021-04-03 18:00:30
@Shaz -arguments.callee已过时,但它是一个非常聪明的实现仍然-它不乱丢全局范围。+1
2021-04-12 18:00:30

在变量名周围使用方括号。

var objname = 'myobject';
{[objname]}.value = 'value';
这是完美而简单的,应该是最佳答案。
2021-03-16 18:00:30
这会引发异常:SyntaxError: expected expression, got '.'。这是行不通的; 为什么这么多赞?
2021-03-31 18:00:30
感谢您提供简单而完美的答案!
2021-04-09 18:00:30

它是一个全局变量吗?如果是这样,这些实际上是window对象的一部分,因此您可以执行window[objname].value.

如果它是函数的本地函数,我认为没有什么好方法可以做你想做的事。

该对象存在于某个范围内,因此您几乎总是可以通过以下语法访问该变量:

var objname = "myobject";
containing_scope_reference[objname].some_property = 'some value';

唯一棘手的地方是当您处于封闭范围内并且想要访问顶级局部变量时。当你有这样的事情时:

(function(){
    var some_variable = {value: 25};
    var x = "some_variable";
    console.log(this[x], window[x]); // Doesn't work
})();

可以通过使用eval代替访问当前作用域链来解决这个问题……但我不推荐它,除非您已经进行了大量测试并且您知道这是处理事情的最佳方式。

(function(){
    var some_variable = {value: 25};
    var x = "some_variable";
    eval(x).value = 42;
    console.log(some_variable); // Works
})();

最好的办法是有一个始终要到待有物体(比如一个名字的引用this在全局范围内或在局部范围内的私人顶级变量),并把一切都在那里东西。

因此:

var my_outer_variable = {};
var outer_pointer = 'my_outer_variable';
// Reach my_outer_variable with this[outer_pointer]
// or window[outer_pointer]

(function(){
    var my_inner_scope = {'my_inner_variable': {} };
    var inner_pointer = 'my_inner_variable';
    // Reach my_inner_variable by using
    // my_inner_scope[inner_pointer]
})();

你可以使用eval

eval(variablename + ".value = 'value'");
@PeeHaa:如果您正在考虑移动它,为什么不将其移动到已知对象的属性中,这样您就可以执行类似的操作myVar[objname].value
2021-03-27 18:00:30
哈哈。如果变量名称来自用户输入,请确保对其进行验证,使其不包含任何eval可以执行的JS 代码
2021-04-03 18:00:30
eval在我看来,这是 的少数合法用途之一不过,我们必须确保变量是干净的。
2021-04-03 18:00:30
eval考虑evil吗?如果没有,我可能会使用它。因为它现在是一个全局的,但我想把它移到一个函数中来清理东西。
2021-04-06 18:00:30
是的,这不是问题。但是看看Shaz的回答。我认为这是一个更干净的解决方案。
2021-04-09 18:00:30