为什么我的while循环返回undefined

时间:2016-06-22 14:37:44

标签: javascript while-loop

var names = ["Patrick", "Lizzy", "Walty"];

for (var i = 0; i < 3; i += 1) {
    console.log("My name is: " + names[i]);
};

while (names) {
    console.log("According to the while loop, my name is " + names[i]);
    var names = false;
};

这是打印出来的代码:

My name is: Patrick 
My name is: Lizzy 
My name is: Walty 
My name is: undefined
According to the while loop, my name is undefined

为什么while循环返回&#34; undefined&#34;而不是三个名字中的每一个?任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

你有两个问题:

  1. JS不使用块作用域,因此i仍然有效并设置为3
  2. JS使用类型强制,因此转换为布尔值的names始终为真。
  3. 因此,您的while循环等同于:

    var names = true; // coercion!
    while (names) {
      console.log("According to the while loop, my name is " + names[3]);
      var names = false;
    };
    

    你应该在进入while循环之前重置计数器,然后在进行时递增它:

    var i = 0;
    while (i < 3) {
      console.log("According to the while loop, my name is " + names[i]);
      ++i;
    };
    

    请记住,for循环只是while循环的糖,允许您在开头声明计数器。

    您可以引入names.length来替换常量3并更加惯用地处理数组:

    for (var i = 0; i < names.length; i += 1) {
      console.log("My name is: " + names[i]);
    };
    
    var i = 0;
    while (i < names.length) {
      console.log("According to the while loop, my name is " + names[i]);
      ++i;
    };
    

    如果您想使用现代功能并变得聪明,可以在数组上使用forEach方法:

    names.forEach(function (name) {
      console.log("My name is: " + name);
    });
    

    这样,您根本不必担心循环或索引。

    如果names可能不是数组,则可以使用ES6语法遍历任何可迭代对象:

    for (const name of names) {
      console.log('My name is:', name);
    }
    

答案 1 :(得分:0)

您过早地打破了for循环。这就是原因。在这种情况下,您在;之后也不需要}

您获得undefined的原因是,while循环时,i的值为3,超出names数组的大小。

names返回的布尔值始终为true,因此无论如何都会执行。

&#13;
&#13;
var names = ["Patrick", "Lizzy", "Walty"];


for (var i = 0; i < 3; i += 1) {
  console.log("My name is: " + names[i]);
}
// Here the value of i is 3, which is out of bounds. So try using i-1:
while (names) {
  console.log("According to the while loop, my name is " + names[i-1]);
  var names = false;
}
&#13;
&#13;
&#13;

答案 2 :(得分:0)

const arr = [1,2,3,2,4,1,5,1,6]; const r = {}; arr.forEach(e=>r[e]?r[e].push(e):r[e]=[e]); console.log(r);循环退出时,for()的值为i。然后使用该3作为数组的索引,但是您的数组只有键0-> 2的值