Javascript 为什么我的while循环返回未定义
为什么while循环返回“undefined”,而不是三个名称中的每一个?任何帮助都将不胜感激 您过早地中断了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使用类型强制,因
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。@RJMnames
从未设置为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);
}