2016-06-22 3 views
-3
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 

Почему цикл при возвращении «неопределенный» вместо каждого из этих трех имен? Любая помощь будет принята с благодарностью!

+0

Значение '' i' это в то время цикла 3', то вы установите его в 'false', который не имеет индексированных свойств. Следовательно, цикл выполняется только один раз. – Teemu

+0

@Teemu 'i = 3'. –

+1

@PraveenKumar Да, конечно;). – Teemu

ответ

0

Вы нарушаете свою петлю for преждевременно. Вот в чем причина. Также вам не нужен ; после } в этом случае.

Причина, почему вы получаете undefined это, к тому времени, он приходит к петле while, значение по i «s является 3, что из размера names массива.

Булево значение, возвращаемое names, всегда истинно, поэтому оно выполняется независимо от того, что.

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; 
 
}

0

Когда цикл завершается в for(), i будет иметь значение 3. Затем можно использовать этот 3 в качестве индекса для вас массив, но ваш массив имеет значения только для ключей 0-> 2

2

У вас есть две проблемы:

  1. JS не использует блок области видимости, так i по-прежнему действителен и установлен в 3.
  2. 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); 
} 
+0

Указанный выше код, эквивалентный коду OP, на самом деле не эквивалентен. В коде OPs имена [i] пытаются разыменовать исходный массив (хотя массив был принудительно привязан к логическому состоянию в условном выражении), но имена [3] выше пытаются разыменовать истинное булевское значение, а не оригинальное array, так как для имен установлено значение true. – RJM

+0

@RJM 'names' никогда не устанавливается в true, хотя позже устанавливается значение' false'. Условие 'while', которое использует OP, не имеет большого смысла, поскольку оно будет выполняться один раз (с плохим индексом), а затем полностью отбросить« имена ». – ssube

+0

Я имею в виду код в этом ответе ... Имена в этой строке установлены как true: 'var names = true; // принуждение! ' – RJM

Смежные вопросы