2016-10-15 4 views
0

Ниже я поставил вопрос и два ответа. Логика ответов представляется мне одинаковой, но решение A работает, а решение B возвращает «false», если «x» не является первой буквой строки. Почему это?Разница между двумя операциями 'if' и контуром 'if/else'

Вопрос:

Напишите функцию с именем hasX(). Он должен принимать в качестве ввода строку, и она должна возвращать значение true, если строка содержит символ «x», а false - если нет.

Раствор А:

function hasX(s) { 

for (var i = 0; i < s.length; i++) 
if (s[i] === 'x') { 
    return true; 
} if (s[i] !== 'x') { 
    return false; 
} 
} 

hasX('I play the xylophone'); 

// returns true 

Раствор Б:

function hasX(s) { 

for (var i = 0; i < s.length; i++) 
if (s[i] === 'x') { 
    return true; 
} else { 
    return false; 
} 
} 

hasX('I play the xylophone'); 

// returns false 
+0

В этой ситуации нет никакой разницы. Даже количество циклов процессора. Таким образом, в приведенном выше примере я бы использовал решение B, так как более ясно, что это if if else – abc123

+3

Отсутствующие фигурные скобки вокруг цикла for изменяют поведение, которое вводит в заблуждение. – zzzzBov

ответ

3

Разница здесь в том, что в первом примере, у вас есть дваif заявления в то время как во втором, у вас есть одинif-else заявление. Так как ваш for цикл не имеет фигурные скобки, он содержит только первый заявление после него, так правильно вложены, они, как это:

for 
    if 

if 


for 
    if-else 

В первом примере второй if выполнения будет после петля была сделана, если она закончена. Во втором примере все if-else выполняется на каждой итерации цикла.

Первый цикл повторяется до тех пор, пока он не найдет символ со значением x или не достигнет конца массива, а второй сразу вернется, потому что первый символ либо x, либо нет.

На самом деле вам не нужны два условия. Вы можете правильно написать функцию, как это:

function hasX(s) { 
 

 
    for (var i = 0; i < s.length; i++) { 
 
    if (s[i] === 'x') { 
 
     return true; 
 
    } 
 
    } 
 

 
    // didn't find an x 
 
    return false; 
 
} 
 

 
console.log(hasX('I play the xylophone')); 
 

 
console.log(hasX('I play the piano'));

Я бы посоветовал всегда использовать фигурные скобки вокруг тела ваших петель и if отчетности. Это помогает предотвратить такие подлые ошибки.

+0

Спасибо! Теперь я понимаю. – mkhira2

0

IF-ELSEIF:

start; 
if() \\true 
break; 
end; 

IF = FALSE - перейти к ELSE-IF. Если TRUE - перерыв.

IF-IF:

start; 
if() \\true 
if() 
end; 

Выполнить 2 ИФ.

0

Это связано с эффективностью и вашими потребностями. Если утверждения выполняются независимо друг от друга. Каждый из них будет работать. Else if if выполняется только в том случае, если предыдущий if сбой. :)

-1

Обе эти функции возвратят false, потому что каждый из них проверяет первый символ и возвращает.

Что вы хотите сделать, это вернуть true, только если символ == 'x'. Если это не так, вы еще не хотите возвращаться. Вам нужно разрешить цикл для продолжения и проверить следующий символ.

Только после того, как вы проверили все символы и концы цикла, вы знаете, что строка не имеет «x», поэтому только тогда вы должны вернуть false.

1

В вашем случае логически не существует разницы между двумя операциями «if» или «if/else». Этот пример покажет вам разницу в общем: пример 1:

function name{ 
if(condition 1){ //Task1; } 
if(condition 2){ //Task2; } 
} 

В этом примере, если оба условия истинны ваш код будет работать через обе петли, если цикл не возвращает значение (которое останавливает дальнейший код от выполнения).

Пример 2:

function name{ 
if(condition1){ //Task1; } //loop1 
else{ //Task 2; }   //loop2 
} 

В этом примере код будет выполняться либо loop1 (если «condition1» истинно) или петля 2 (в противном случае), так что ваш код, если работать только либо через одну из петель ,

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