2016-02-18 4 views
-3
var 
      type = 'foo', 
      type2 = 'bar', 
      result = 0; 

     type == 'foo' && result++; 
     console.log(result); // 1 
     !type == 'foo' || result++; 
     console.log(result); // 2 
     type == 'foo' && type2 == 'bar' && result++; 
     console.log(result); //3 
     type == 'foo' && type2 == 'bar' && result == 3 && (result=0); //parentheses avoid "invalid assignment left-hand side" error 
     console.log(result); //0 
     type == 'OOF' || result++; //equivalent: type != 'OOF' && result++; 
     console.log(result); //1  

в каком порядке это работает?JS логические операторы

  type == 'foo' && result++; 
     !type == 'foo' || result++; 

полный текст статьи (https://github.com/shichuan/javascript-patterns/blob/master/general-patterns/conditionals.html)

+0

Если 'type == 'foo'' истинно, тогда будет увеличиваться только' result ++ '... В случае' '' независимо от первого условия выполняется 'result' будет увеличиваться ... – Rayon

ответ

0

Позволяет разбить его:

type == 'foo' && result++; 

Благодаря оценке короткого замыкания, то вторая часть result++ только получает оценку, если type == 'foo'. Довольно простой случай, не так ли? Давайте рассмотрим второе условие:

!type == 'foo' || result++; 

Возможно, это не так, как вы думаете. Вы оцениваете тип логическим, что в этом случае любая непустая строка вернет true. Вы отрицаете это значение, поэтому получаете false. Сравнивая false с 'foo', вы получаете false. Чтобы коротко закоротить это выражение, первая часть должна быть верной, но она неверна, поэтому, короче говоря, result++ всегда будет оцениваться.

Вы, вероятно, имел в виду следующее:

!(type == 'foo') || result++ 

Или одинаково приемлемы:

type != 'foo' || result++ 

Давайте посмотрим на следующее:

type == 'foo' && type2 == 'bar' && result == 3 && (result=0) 

Если тип Foo, то оценивает следующий раздел, поэтому type2 == 'bar'. Если это так, то он будет оценивать result == 3. Если это так, то результат получает , назначенный, 0, так как вы не проверяете эквивалентность. Таким образом, если тип «foo», а type2 - «bar», а результат равен 3, задайте результат на 0.

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

Надеюсь, что это поможет.

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