2015-10-08 3 views
0

В настоящее время я пытаюсь ознакомиться с JavaScript через решение задач Project Euler. В следующем фрагменте я пытаюсь получить сумму всех чисел фибоначчи ниже 4.000.000.Состояние JavaScript оценивается как false?

var sum = 0; 
var fibNums = [1, 2]; 
for (var i = 2; fibNums[i] < 4000000; i++) { 
    fibNums[i] = fibNums[i - 1] + fibNums[i - 2]; 
    sum += fibNums[i] % 2 == 0 ? fibNums[i] : 0; 
} 
console.log(sum); 

Моя проблема заключается в том, что fibNums[i] < 4000000 оценивается как ложное, даже при первом запуске. Как это происходит?

+2

Нет 'fibNums [2]'. – Barmar

+0

Почему в мире вопрос сохраняется? Я вижу небрежность в этом не замечательном вопросе. Кроме того, зная, что индекс начинается с '0', имеет место с момента C или C++. Я чувствую, что это абсолютная небрежность. –

+0

@AkshayKhandelwal. Я знаю, что индексы начинаются с 0, я просто не знаком с javascript. Обычно я работаю с C#, что означает, что я действительно получаю исключение из диапазона для таких проблем. – mstorm

ответ

4

Вкратце:(fibNums[i = 2] === undefined), тогда как (undefined < 40000 === false).

Longer:

Вы начинаете свой for цикл с var i = 2, в то время как fibNums массив содержит только два элемента и имеет индексы, начинающиеся с 0. Следовательно, fibNums[2] будет undefined. В JavaScript undefined не меньше числа, так как при сравнении любого номера с undefined всегда будет false.

+0

Значит, undefined равно false в javascript? – mstorm

+1

@MuhammadUsman Нет, это означает, что всякий раз, когда вы сравниваете 'undefined' с числом, результат всегда' false'. – Barmar

+0

Извините, моя ошибка –

0

var sum = 0; 
 
var fibNums = [1, 2, 0]; 
 

 
for (var i = 2;fibNums[i] < 4000000; i++) { 
 
    fibNums[i] = fibNums[i-1] + fibNums[i-2]; 
 
    sum += fibNums[i] % 2 == 0 ? fibNums[i] : 0; 
 
    fibNums.push(fibNums[i]); 
 
} 
 

 
alert(sum);

+0

Не провалится ли он на следующей итерации? – Barmar

+0

У меня есть обновленный код сейчас? – Mitul

+0

Вместо того, чтобы нажимать дубликат 'fibnums [i]', не могли бы вы просто проверить 'fibnums [i-1] <4000000'? – Barmar

0
индексов

JavaScript массива начинаются с 0. То, как вы используете i вы должны проверять fibNums[i - 1] < ...:

var sum = 0; 
var fibNums = [1, 2]; 
for (var i = 2; fibNums[i - 1] < 4000000; i++) { 
    fibNums[i] = fibNums[i - 1] + fibNums[i - 2]; 
    sum += fibNums[i] % 2 == 0 ? fibNums[i] : 0; 
} 
console.log(sum); 

Теперь о сравнении undefined с Numberusing the < operator:

  • Оба операнда не String так JavaScript пытается преобразовать оба операнда в Number
  • Number(undefined) является NaN (ref)
  • И NaN не равно, больше или меньше, чем любое число. Оба undefined < 1 и undefined > 1 оценивают до false.
+0

просто замените на '(fibNums [i]% 2)? fibNums [i]: 0; ' –