У вас есть две проблемы:
- JS не использует блок области видимости, так
i
по-прежнему действителен и установлен в 3
.
- JS использует тип принуждения, поэтому
names
, преобразованный в логическое значение, всегда верен.
Из-за этого, ваш while
цикл эквивалентно:
var names = true; // coercion!
while (names) {
console.log("According to the while loop, my name is " + names[3]);
var names = false;
};
Вы должны сбросить счетчик, прежде чем попасть в то время цикла, а затем увеличивать его, как вы идете по:
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 для перебора любого Iterable объекта:
for (const name of names) {
console.log('My name is:', name);
}
Значение '' i' это в то время цикла 3', то вы установите его в 'false', который не имеет индексированных свойств. Следовательно, цикл выполняется только один раз. – Teemu
@Teemu 'i = 3'. –
@PraveenKumar Да, конечно;). – Teemu