【问题标题】:How do you create variables in for loop?你如何在for循环中创建变量?
【发布时间】:2012-04-26 00:22:09
【问题描述】:

我正在尝试在 for 循环中动态创建变量。错误。我要做的是:获取 32 个文本字段的值并尝试将这些值存储到变量中。

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

但这会产生:

错误:“q”未定义

【问题讨论】:

  • 始终小心直接执行 document.getElementById().value。如果该 id 不存在,则返回的对象通常为 null,并且您不能取 null 值。这也会破坏你的脚本。

标签: javascript variables for-loop


【解决方案1】:
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 循环中声明 var 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;
}

【讨论】:

  • 这完全是错误的。 JavaScript 没有块作用域。 JavaScript 只有函数作用域和全局作用域。在 for 循环中声明一个变量是完全有效的,并且该变量将在该循环之外可用。这是不好的做法,但令人困惑。
  • 是的。对于受过高级语言培训的程序员来说,这简直令人困惑,但这是真的,
  • 这可能仍然行不通,除非确实有一个带有id="qty[i]" 的元素。但从 OP 中并不能完全清楚 应该是什么
  • @Chuck 不错。 OP 对此并不清楚,但像 document.getElementById('qty[' + i + ']') 这样的东西可以解决问题。
  • "JavaScript 只有函数作用域和全局作用域。"在 ES6 中不正确(let 语句)。
【解决方案2】:

你试过了吗:

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

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

【讨论】:

  • 只是出于好奇,你为什么使用q.pushq[i] 工作得很好。
  • q[i] 在这种情况下可以正常工作,但要小心只做索引。它们会为您提供奇数大小的数组,因为 javascript 会将数组初始化为您指定的索引,并且每个元素都未定义。 jsfiddle.net/uNwSA q.push 是一种更好的做法,而且是面向对象的,除非索引很重要。
  • 我知道这一点。我只是想知道为什么他在这种情况下使用 push(),因为 q[i] 可以正常工作并且可能更快。
  • @Kirean 虽然我同意使用push,但您所说的并不完全准确。 length 只是一个特殊属性,等于最高索引加 1。JavaScript 中的数组是稀疏填充的,因此其他索引只是未定义,未初始化。
  • 这是因为密钥的大小 - 9000 是四个字符,8 是 1 个字符。 (4-1)*2 考虑了计算中的大小字节差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2019-06-14
相关资源
最近更新 更多