如果我有:
var b1 = ["B", "V"];
我可以使用"V"
;
b1[1]
为什么以下不起作用:
console.log(("b"+1)[1]);
我在控制台得到1。
答案 0 :(得分:2)
如果在全局范围中定义了b1
,则可以将其作为窗口对象的成员进行访问:
// When variable is defined in global scope
var b1 = ["B", "V"];
console.log(window['b'+1][1]);
// Inside a function you're stuck with eval.
// You should be really, really careful with eval.
// Most likely you can change your design so you wont need it.
function test() {
var b2 = ["B", "V"];
console.log(eval(('b'+1))[1]);
}
test();
// Just to demonstrate that accessing an object's properties
// always works the same way
window['console']['log']('hi');
答案 1 :(得分:1)
您在控制台中获得1,因为"b"+1
被格式化为字符串"b1"
。此字符串中的索引1是字符1
。
做你想做的事是非常糟糕的主意。如果要使用其他调用中的数字访问这些变量,请使用数组b = []
,然后使用b [index] [subindex]`作为字符串。
或使用window
范围变量。
答案 2 :(得分:0)
为什么会得到这样的结果
当你连接一个String和一个数字(+
)时,你得到一个String。在String上使用括号表示法将获得某个索引处的字符。在您的情况下,"1"
。
如何使其发挥作用
如果您的b1
变量是全局变量(未在函数内定义),则它是window
的属性。因此,您可以使用window["b"+1]
访问它。
var b1 = ["B", "V"];
console.log( window["b"+1][1] ); // "V"

如果它是本地的(在函数内部),请使用Object来存储它:
var scope = {};
scope.b1 = ["B", "V"];
console.log( scope["b"+1][1] ); // "V"