【问题标题】:Basic For Loop Logic Doesn't make sense to me基本的 For 循环逻辑对我来说没有意义
【发布时间】:2016-07-06 05:02:42
【问题描述】:

我一直在尝试学习 Javascript,这有点令人沮丧。我又开始学习基础知识了,我正在玩下面的这些for 循环和数组。

谁能解释一下为什么这段代码的输出是[1,2,3,4,5]而不是[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]

var game1 = new Array();
for(i = 25; i > "love is like a river".length; i = i - 1) {
  console.log(game1.push(i)); 
}

【问题讨论】:

  • 呃,我得到了预期的[25, 24, 23, 22, 21] 作为game1 的结果?
  • @Bergi "..请解释为什么这个代码的 输出.."。他们不是在谈论game1 的值,而是在控制台的输出。此代码未将输出显示为数组。

标签: javascript arrays for-loop


【解决方案1】:
console.log(game1.push(i));

该语句的作用是将被推送元素的索引打印到控制台。结果 1,2,3,4,5 是数组的长度。

你要编码的是:

var game1 = [];

for(i = 25; i > "love is like a river".length; i--){

console.log(i);
game1.push(i);
}

在上面的例子中我切换了数组的声明,因为这是最常见的方式(这不是必需的)。它仍然可以正常使用您的声明版本。在 for 循环中我已经切换了

i = i - 1;

简写:

i-- or --i

将 'i' 减 1。我也分开了

console.log(i) and game1.push(i) to be separate

这将打印出 'i' 的结果:25,24,23,22,21 这是因为 for 循环执行用户在循环结束时定义的操作,因此当循环打印出 21 并将其推送到数组时,它会递减到 20,循环停止。该数组仍将包含数字 25、24、23、22、21。但控制台不会记录它。

如果您想要上面定义的输出,您必须:

var game1 = [];
for(i = 6;i >= 25; i++){
game1.push(i);
console.log(game1[i-6]);
}

在此您将“ i ”添加到 game1 导致 [6,7,8,9,10,11,12,13,14...25] 并将变量记录在“ i - 6 的索引处'。这将导致方括号中的数字从 0 开始为“0,1,2,3,4,5”,因为这是所有数组索引的开始位置。

【讨论】:

    【解决方案2】:

    length 属性返回字符串的长度(字符数)。以这种方式"love is like a river".length 给出 20。我想你误认为它没有。的话。然后循环将表现得像

    var game1 = new Array();
    for(i = 25;i>20;i=i-1){
        console.log(game1.push(i));
    }
    

    要获得您预期的答案,代码将是:

    var game1 = new Array();
    for(i = 25;i>"love is like a river".length;i=i-1){
      console.log(game1.push(i));
    }
    

    【讨论】:

    • 谢谢,这很有帮助。
    【解决方案3】:

    您将得到预期的[25, 24, 23, 22, 21] 作为game1 的结果!

    123……您看到的是您正在记录的 Array push calls 的结果,每次都会产生数组的长度。

    【讨论】:

    • 是的,我的目标是让 6-25 进入阵列。但是你在哪里看到预期的 25-21?
    【解决方案4】:

    "love is like a river".length 是 20。所以循环等价于:

    for(i = 25; i>20; i=i-1){
    
    }
    

    话虽如此,您有 5 次 console.log 调用,每一步都将以下参数传递给它:

    game1.push(25)
    game1.push(24)
    game1.push(23)
    game1.push(22)
    game1.push(21)
    

    不知道game1.push 的确切作用,很难说。但是,假设game1 是一个数组,您将在每次推送时获得数组的新长度。

    根据MDN

    push() 方法将一个或多个元素添加到数组的末尾 返回数组的新长度

    【讨论】:

    • 这正是让我感到困惑的地方。 game1.push(25) 最终是 1,因为那是数组中的第一个位置,但我希望实际将数字 25 推入数组中。我最喜欢你的回答是它向我展示了 MDN 如何显示 push() 方法如何将一个元素添加到数组并返回数组的新长度。
    • 在这样的情况下,坐下来想想什么是对函数的实际有用的实现总是好的。这更像是一个一般性的建议,如果你仔细想想,你不会对为什么有些事情是这样的(不是所有的都很明显)感到惊讶。
    【解决方案5】:

    "love is like a river".length20,所以你将从i=25 开始直到i=21

    [1,2,3,4,5] 代表每个循环的 lengthgame1

    查看game1 值:

    for(i=0; i<game1.length; i++) {
     console.log(game1[i]);
    }
    

    结果:[25,24,23,22,21]

    【讨论】:

      【解决方案6】:

      让我们从分解代码开始,从您存储在 变量 game1new Array() 构造函数 开始/strong>。

      var game1 = new Array();
      

      此时,你所拥有的只是一个empty 数组,它已被存储在一个变量中以供以后使用.顺便说一句,这相当于 数组文字var game1 = []

      让我们进入代码的下一部分,即 for() 循环:

      for (i = 25; i &gt; "love is like a river".length; i--) {}

      这个循环在 上限 25 处初始化,然后递减到 length() 设置的 下限 20 > 字符串属性 条件。在这个循环中你有 statement:

      console.log(game1.push(i));

      方法 push() 将一个或多个元素添加到数组 的末尾并返回 array 的新 length 到堆栈。这个方法依赖于length属性来确定它的注入点。因此,在迭代之前,game1 stack 当前位于 0,因为您从未使用任何值填充 array .当您执行迭代时,push() method 将在每一步向堆栈添加一个 undefined 值,通过增加 数组长度1

      这可以通过使用单个数字参数调用您的game1 变量来说明,这将设置的初始大小数组。这是一个例子:

      var string = 'love is like a river';
      
      var game1 = new Array(15);
      
      for (i = 25; i > string.length; i--) {
        console.log(game1.push(1));
      }

      如您所见,我将数字 参数 15 传递给 new Array() 构造函数初始 game1 length 堆栈为 15。因为我们从 25 (i = 25) 递减到 20 (string.length) 我们迭代 5 次,产生预期的结果:[16,17,18,19,20]。

      如果您正在寻找 [6, 7, 8,...,25] 的结果,您可以调整您的 for() 循环 递增 而不是 递减 并将初始化器设置为 6。如下所示:

      var s = "love is like a river";
      
      for (i = 6; i <= s.length + 5; i++) {
        console.log(i);
      }

      【讨论】:

        猜你喜欢
        • 2020-10-12
        • 2018-01-31
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多