2015-06-14 8 views
1

я читал код, который показывает, как использовать логический & & оператор делает «если» заявление.Если заявления без если

someBoolean && (someStatement = 10); 

равно:

if(someBoolean) { 
someStatement = 10;} 

Я знаю, как & & работы. Но я не мог понять, как это работает, как если бы в этом примере.

& & операторы работают следующим образом: Если первое значение является ложным, то он будет возвращен, иначе он будет искать, пока он не может найти ложное значение. Если нет, последнее значение будет возвращено.

В этом примере, если someBoolean ложно, "someBoolean" будут возвращены! Иначе будет возвращена часть "(someStatement = 10)".

Но это как раз противоположное «если». Не так ли?

+3

Да, это не очень читаемый способ сделать это. Логический оператор AND только идет вправо, если левая сторона верна. – adeneo

+0

Вы не хорошо читали мой вопрос! –

+0

@AmirJalilifard Возможно, но я думаю, что вы не изучаете то, что сказал adeneo. Это просто выражение, которое имеет назначение с одной стороны. –

ответ

5

Но это как раз противоположное «если». Не так ли?

Нет, он окажет тот же эффект, что и оператор if.

Если первый операнд (someBoolean) является ложным, то это значение используется для всего выражения, а второй операнд (someStatement = 10) не оценивается, поскольку он не нужен.

Если первый операнд верно, то второй операнд должен быть оценен, чтобы определить значение всего выражения.

1

Если someBoolean истинно, то остальная часть выражения будет оцениваться в (someStatement = 10).

Ценности не «возвращены» if заявлениями, они оценены.

Этот метод игнорирует результат выражения, что прекрасно.

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

2

Он работает как бы в том смысле, что после того, как первое выражение истинно, то второе оценивается. Напротив, если первое выражение оценивает значение false, второе выражение не будет оцениваться. В моем примере ниже значение для b никогда не назначается, потому что второе, если начинается с false & &. Во втором предупреждении вы увидите «undefined».

var a; 
 
if(true && (a = 10)) 
 
    alert(a) //alerts 10 
 

 
var b; 
 
if(false && (b = 5)) 
 
    alert(b) //never alerts b/c of the false above 
 
     
 
alert(b); //alerts undefined b/c (b = 5) is never evaluated

4

Ключом к использованию логических выражений является понимание Short-circuit Evaluation (который вы намекаете на ваш вопрос). Если быть точным, ничего не возвращается, но я думаю, что вы имеете в виду, что оно «оценивается», но поскольку результат не будет снят, эта оценка будет потеряна.

Но этот подход к «если» не заинтересован в конечном результате, он просто использует оценку короткого замыкания, чтобы условно оценить вторую часть выражения, если первая часть является истиной.

Так, некоторые примеры:

  • x && (y = 10): только назначает 10 к у, если х верно
  • x || (y = 10): только назначает 10 к у, если х ложна
  • !x || (y = 10): только назначает 10 к у если x истинно

Этот стиль трудно читать, конечно, поэтому обычно не рекомендуется для исходного кода. Хотя я часто вижу это в сокращенном коде, так как он сохраняет пару символов.

+0

Отличное объяснение, особенно включение оценки короткого замыкания, мини-код и примеры. – ThisClark

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