Javascript 为什么我的while循环返回未定义

Javascript 为什么我的while循环返回未定义,javascript,while-loop,Javascript,While Loop,为什么while循环返回“undefined”,而不是三个名称中的每一个?任何帮助都将不胜感激 您过早地中断了for循环。这就是原因。此外,您不需要 您得到未定义的的原因是,当它进入while循环时,i的值是3,这超出了名称数组的大小 names返回的布尔值始终为true,因此无论发生什么情况,它都会被执行 var name=[“Patrick”、“Lizzy”、“Walty”]; 对于(变量i=0;i2的值。您有两个问题: JS不使用块作用域,因此i仍然有效,并设置为3 JS使用类型强制,因

为什么while循环返回“undefined”,而不是三个名称中的每一个?任何帮助都将不胜感激

您过早地中断了
for
循环。这就是原因。此外,您不需要
}
后面的code>

您得到未定义的
的原因是,当它进入
while
循环时,
i
的值是
3
,这超出了
名称
数组的大小

names
返回的布尔值始终为true,因此无论发生什么情况,它都会被执行

var name=[“Patrick”、“Lizzy”、“Walty”];
对于(变量i=0;i<3;i+=1){
log(“我的名字是:“+names[i]);
}
//这里i的值是3,这超出了界限。因此,请尝试使用i-1:
while(姓名){
log(“根据while循环,我的名字是”+names[i-1]);
var name=false;
}
for()
循环退出时,
i
的值将为
3
。然后使用该3作为数组的索引,但数组中只有键0->2的值。您有两个问题:

  • JS不使用块作用域,因此
    i
    仍然有效,并设置为
    3
  • JS使用类型强制,因此将
    名称
    转换为布尔值始终为true
  • 因此,您的
    while
    循环相当于:

    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循环之前,应重置计数器,然后在继续进行时递增:

    var names = true; // coercion!
    while (names) {
      console.log("According to the while loop, my name is " + names[3]);
      var names = false;
    };
    
    如果要使用现代功能并变得聪明,可以在阵列上使用以下方法:

    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;
    };
    
    这样,您根本不必担心循环或索引

    如果
    names
    可能不是数组,则可以使用ES6语法在任何iterable对象上循环:

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

    while循环中
    i
    的值为
    3
    ,然后将其设置为
    false
    ,该值没有索引属性。因此循环只执行一次。@PraveenKumar是的,当然;)。我不相信你真的收到了信息
    我的名字是:undefined
    。这是真的吗?上面所说的与OP的代码等价的代码实际上并不等价。在OPs代码中,名称[i]试图取消引用原始数组(即使在while条件中该数组被强制为布尔值),但上面的名称[3]试图取消引用一个真正的布尔值,而不是原始数组,因为名称已设置为true。@RJM
    names
    从未设置为true,尽管它后来被设置为
    false
    。OP使用的
    while
    条件没有多大意义,因为它将运行一次(索引不正确),然后完全丢弃
    名称。我指的是这个答案中的代码…这行中的名称设置为true:
    var names=true;//强迫我试图说明在进入循环之前,
    名称
    是如何被强制的,尽管这个例子有点混乱。如果您有改进,我将接受编辑。:)
    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;
    };
    
    names.forEach(function (name) {
      console.log("My name is: " + name);
    });
    
    for (const name of names) {
      console.log('My name is:', name);
    }