2015-03-06 3 views
0

Вот мой полный код (JavaScript):Результат Оператор IF вложен в цикле WHILE путаешь меня (Javascript)

var products = ["Choo Choo Chocolate", "Icy Mint", "Cake Batter", "Bubblegum"]; 
var hasBubbleGum = [false, false, false, true]; 
var i = 0; 

while (i < hasBubbleGum.length) { 
    if (hasBubbleGum[i]) { 
     console.log(products[i] + " contains bubblegum"); 
    } 
    i = i + 1; 
} 

Этот код возвращается на консоль:

Bubblegum contains bubblegum 

Что меня смущает это IF, вложенный в мой цикл while. Я знаю, что этот код правильный, но я не понимаю, почему он обходит оператор IF, когда hasBubbleGum установлен в FALSE.

Моя первоначальная мысль была, что печать на консоль даст:

Choo Choo Chocolate has bubblegum 
Icy Mint has bubblegum 
Cake Batter has bubblegum 
Bubblegum has bubblegum 

Я пропускаю ключевую фундаментальную идею, что если оператор игнорировать логические значения FALSE?

+1

Пожалуйста, покажите нам весь цикл. Мы не видим закрывающие фигурные скобки, поэтому перед ними может быть больше заявлений. В частности, мы не можем видеть, что происходит, если угодно, с вашей индексной переменной 'i'. – BaseZen

+0

IF проверяет, является ли условие истинным или ложным. Поскольку 'hasBubbleGum [0]' false, IF разрешает FALSE и обычно пытается обработать 'else' (который, кажется, отсутствует, ваш код выглядит неполным), поэтому он ничего не делает ... увеличивать счетчик (также не показано, но я предполагаю, что он где-то там), перейдите к следующей итерации. «Выход» показывает только, когда он находит значение TRUE по индексу 4 – Ditto

+0

Прошу прощения. Я полностью забыл закончить цикл в своем сообщении. – jakewies

ответ

4

Я пропустил ключевую фундаментальную идею о том, что операторы IF игнорируют логические значения FALSE?

Да, вы есть. Это целая точка if. В большинстве языков, if утверждения следуют следующей схеме:

if (expression) then {statements} 

с then подразумевалось, а не напечатал, на многих языках. {statements} исполняются только , если(expression) is true или 'thruthy' для языков, которые позволяют имплицировать отливку до boolean или не имеют родной boolean. Например, 0 считается false на многих языках, и ничего не 0 будет true.

Ваше hasBubbleGum[i] - это выражение, которое вернет значение boolean в зависимости от содержимого массива с индексом i.Возможно, ваше замешательство возникло из-за не понимания того, какие условные выражения, например, == do; они просто являются «специальными функциями», которые возвращают либо true, либо false на основе их операндов.

if заявления являются одним из основных принципиальных Control Flow примитивов. Цель операторов управления потоком заключается в том, что они «контролируют поток выполнения программы» на основе некоторого состояния. Цикл while также является оператором потока управления; Код внутри его области действия выполняется в цикле, пока его условие остается истинным.

+0

спасибо! Четкое представление о том, как действует инструкция if! – jakewies

2

Код верный, на самом деле единственный продукт, установленный на true, является "Bubblegum".

Если вы хотите, чтобы ваш желаемый результат, вы должны изменить свою Ую маску следующим образом:

var hasBubbleGum = [true, true, true, true]; 

Там нет ничего плохого в if заявления, единственное условие, которое true ваш последний hasBubbleGum BOOL массив.

2

Я не понимаю, почему он обходит инструкцию IF, когда hasBubbleGum установлен в FALSE.

Это не обходя if заявление: if выполняется оператор, оценивает его состояние (hasBubbleGum[i]), видит, что полученное значение false, и поэтому не выполняет оператор, присоединенный к нему. Выполняется if, но поскольку hasBubbleGum является ложным для всех записей, кроме i = 3, вы не видите никаких результатов для других записей, только для i = 3.

+0

Охххх хорошо, это имеет смысл. Операторы IF не были сложными, когда оператор в круглых скобках сравнивал два значения с операторами сравнения, но когда я добрался до этого оператора IF, он прошел через цикл (предполагаемый каламбур). – jakewies

+1

@ jake.wies: Ах, да, с вами. Боковое примечание: бит в круглых скобках является выражением *, а не * оператором *. В JavaScript выражение оценивается, а затем (при необходимости) принудительно выполняется к логическому (в вашем случае это не было необходимо, потому что значения в массиве были логическими). В принуждении любое «ложное» считается ложным. Эти значения: '0',' "", 'null',' undefined', 'NaN' и, конечно,' false'. Все остальное является «правдивым», а 'if' переходит в прилагаемое к нему утверждение. –

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