在for循环中如何创建变量?

3

我正在尝试在for循环中动态创建变量,但是出现了错误。我的目标是:获取32个文本字段的值,并尝试将这些值存储到一个变量中。

for (i = 1; i<=32;i++){
   q[i] = document.getElementById('qty[i]').value;
}

但这会产生以下结果:

错误:'q'未定义


在编程中一定要小心直接使用document.getElementById().value。如果该id不存在,则返回的对象通常为null,您无法获取null的值。这也会破坏您的脚本。 - Thomas Jones
2个回答

4
var q = [];

for (var i = 0; i < 32; i++){
    q[i] = document.getElementById('qty[i]').value;
}

q将包含所有值。你应该在for循环之外声明数组q,因为这是常见的最佳实践。如果你根本不声明q,它将成为一个隐含的全局变量,这是你可能要避免的。如果你在循环内部声明q,它将在每次迭代中被覆盖,所以你需要确保你在外部声明它。

此外,你会注意到我将你的for循环改为了这样:

for(i = 1; i <= 32; i++) {

变成这样:

for (var i = 0; i < 32; i++){

你正在从1到32循环; 这是不正确的,因为Javascript中的数组是0索引的; 换句话说,它们从零开始计数。 因此,你的for循环也需要从零开始计数,并以31结束。 此外,你需要在for循环中声明变量i; 否则,它将成为全局变量。
现在,如果你真的不想在for循环之外声明q,你可以像Kirian演示的那样; 也就是说,使用一个if语句来确定是否已经声明了q,如果没有,则声明它。 它会像这样:
for (var i = 0; i < 32; i++){
    if(!q) q = [];
    q[i] = document.getElementById('qty[i]').value;
}

另外需要注意的是,如果在你的代码中qty是一个数组,那么你可能想要使用以下代码:
var q = [];

for (var i = 0; i < 32; i++){
    q[i] = document.getElementById(qty[i]).value;
}

如果qty是一组看起来像qty[1]、qty[2]、qty[3]...的ID中的一部分,那么你需要用这个代码:
var q = [];

for (var i = 0; i < 32; i++){
    q[i] = document.getElementById('qty[' + i + ']').value;
}

4
这是完全错误的。 JavaScript没有块级作用域。JavaScript只有函数作用域和全局作用域。在for循环中声明变量是完全有效的,而且该变量将可以在该循环之外正常使用。但这是不好的实践且容易令人困惑。 - Thomas Jones
是的。对于接受过高级语言培训的程序员来说,这确实很令人困惑。 - Thomas Jones
除非确实存在一个带有 id="qty[i]" 的元素,否则这仍然可能无法正常工作。但从 OP 中并不完全清楚它应该是什么。 - Chuck
@Chuck 很好的发现。虽然 OP 没有表述得很清楚,但是类似 document.getElementById('qty[' + i + ']') 这样的代码可以解决问题。 - Thomas Jones
1
"JavaScript 只有函数作用域和全局作用域。但在 ES6 中不再如此(使用 let 声明)。" - Marek Marczak

2

你尝试过了吗:

var q = [];
for (var i = 0; i < 32; i++){
  q.push(document.getElementById('qty[i]').value);
}

q.push(x) 语法将 x 添加到数组的末尾。


只是出于好奇,为什么您要使用q.push呢?q[i]也可以正常工作。 - Elliot Bonneville
在这种情况下,q[i]将正常工作,但是要小心只使用索引。它们会使数组大小变为奇数,因为JavaScript会初始化数组直到你指定的索引,并且每个元素都是undefined。http://jsfiddle.net/uNwSA/ 使用q.push是更好的做法,也是面向对象的,除非索引很重要。 - Thomas Jones
我知道这一点。我只是想知道为什么他在这种情况下使用push(),因为q[i]可以很好地工作,并且可能更快。 - Elliot Bonneville
@Kirean 虽然我同意使用 push,但你说的并不完全准确。length 只是一个特殊属性,它等于最高索引加 1。JavaScript 中的数组是稀疏的,所以那些其他索引只是未定义的,而不是初始化的。 - Dennis
1
这是由于密钥的大小 - 9000是四个字符,而8只有一个字符。 (4-1)*2 考虑了计算中大小字节的差异。 - Dennis
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接