Поиск…


Вступление

Условные выражения, включающие ключевые слова, такие как if и else, предоставляют программам JavaScript возможность выполнять разные действия в зависимости от логического условия: true или false. В этом разделе рассматриваются использование условных выражений JavaScript, логической логики и трехмерных выражений.

Синтаксис

  • если (условие) оператор;
  • if ( condition ) statement_1 , statement_2 , ... , statement_n ;
  • если ( условие ) {
    заявление
    }
  • если ( условие ) {
    statement_1 ;
    statement_2 ;
    ...
    statement_n ;
    }
  • если ( условие ) {
    заявление
    } else {
    заявление
    }
  • если ( условие ) {
    заявление
    } else if ( условие ) {
    заявление
    } else {
    заявление
    }
  • switch ( выражение ) {
    значение case1 :
    заявление
    [перерыв;]
    значение case2 :
    заявление
    [перерыв;]
    значение caseN :
    заявление
    [перерыв;]
    дефолт:
    заявление
    [перерыв;]
    }
  • состояние ? value_for_true : value_for_false ;

замечания

Условия могут нарушать нормальный поток программы, выполняя код на основе значения выражения. В JavaScript это означает использование операторов if , else if и else и тройных операторов.

Если / Else If / Else Control

В самой простой форме условие if можно использовать следующим образом:

var i = 0;

if (i < 1) {
    console.log("i is smaller than 1");
}

Условие i < 1 оценивается, и если он оценивает значение true выполняется следующий блок. Если он вычисляет значение false , блок пропускается.

Условие if может быть расширено блоком else . Условие проверяется один раз, как указано выше, и если он оценивает значение false , будет выполнен вторичный блок (который будет пропущен, если условие было true ). Пример:

if (i < 1) {
    console.log("i is smaller than 1");
} else {
    console.log("i was not smaller than 1");
}

Предположим, else блок else содержит ничего, кроме другого блока if (с необязательным блоком else ), например:

if (i < 1) {
    console.log("i is smaller than 1");
} else {
    if (i < 2) {
        console.log("i is smaller than 2");
    } else {
        console.log("none of the previous conditions was true");
    }
}

Тогда есть и другой способ написать это, что уменьшает вложенность:

if (i < 1) {
    console.log("i is smaller than 1");
} else if (i < 2) {
    console.log("i is smaller than 2");
} else {
    console.log("none of the previous conditions was true");
}

Некоторые важные сноски о вышеупомянутых примерах:

  • Если какое-либо одно условие оценивается как true , никакое другое условие в этой цепочке блоков не будет оценено, и все соответствующие блоки (включая блок else ) не будут выполнены.

  • Количество else if части практически не ограничены. Последний пример выше содержит только один, но вы можете иметь столько, сколько хотите.

  • Условие внутри оператора if может быть любым, что может быть принудительно использовано для логического значения, более подробно см. В разделе логической логики ;

  • Линия if-else-if выходит с первого успеха. То есть, в приведенном выше примере, если значение i равно 0,5, то выполняется первая ветвь. Если условия перекрываются, выполняются первые критерии, происходящие в потоке выполнения. Другое условие, которое также может быть верно, игнорируется.

  • Если у вас есть только один оператор, скобки вокруг этого утверждения технически необязательны, например, это нормально:

    if (i < 1) console.log("i is smaller than 1");
    

    И это тоже будет работать:

    if (i < 1) 
        console.log("i is smaller than 1");
    

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

    if (i < 1) 
        console.log("i is smaller than 1");
        console.log("this will run REGARDLESS of the condition"); // Warning, see text!
    

    эквивалентно:

    if (i < 1) {
        console.log("i is smaller than 1");
    }
    console.log("this will run REGARDLESS of the condition");
    

Оператор switch

Операторы switch сравнивают значение выражения с 1 или более значениями и выполняют разные разделы кода на основе этого сравнения.

var value = 1;
switch (value) {
  case 1:
    console.log('I will always run');
    break;
  case 2:
    console.log('I will never run');
    break;
}

Оператор break «вырывается» из инструкции switch и гарантирует, что в выражении switch не будет больше кода. Вот как определяются разделы и позволяет пользователю делать «проваливающиеся» случаи.

Предупреждение : отсутствие отчета о break или return для каждого случая означает, что программа продолжит оценивать следующий случай, даже если критерии дела неудовлетворены!

switch (value) {
  case 1:
    console.log('I will only run if value === 1');
    // Here, the code "falls through" and will run the code under case 2
  case 2:
    console.log('I will run if value === 1 or value === 2');
    break;
  case 3:
    console.log('I will only run if value === 3');
    break;
}

Последний случай - случай по default . Этот будет запускаться, если не будет сделано никаких других матчей.

var animal = 'Lion';
switch (animal) {
  case 'Dog':
    console.log('I will not run since animal !== "Dog"');
    break;
  case 'Cat':
    console.log('I will not run since animal !== "Cat"');
    break;
  default:
    console.log('I will run since animal does not match any other case');
}

Следует отметить, что выражение случая может быть любым выражением. Это означает, что вы можете использовать сравнения, вызовы функций и т. Д. Как значения case.

function john() {
  return 'John';
}

function jacob() {
  return 'Jacob';
}

switch (name) {
  case john(): // Compare name with the return value of john() (name == "John")
    console.log('I will run if name === "John"');
    break;
  case 'Ja' + 'ne': // Concatenate the strings together then compare (name == "Jane")
    console.log('I will run if name === "Jane"');
    break;
  case john() + ' ' + jacob() + ' Jingleheimer Schmidt':
    console.log('His name is equal to name too!');
    break;
}

Множественные критерии включения для случаев

Поскольку случаи «проваливаются» без инструкции break или return , вы можете использовать это для создания нескольких включительных критериев:

var x = "c"
switch (x) {
   case "a":
   case "b":
   case "c":
      console.log("Either a, b, or c was selected.");
      break;
   case "d":
      console.log("Only d was selected.");
      break;
   default:
      console.log("No case was matched.");
      break;  // precautionary break if case order changes
}

Тернарные операторы

Может использоваться для сокращения операций if else. Это очень удобно для быстрого возврата значения (т. Е. Для присвоения ему другой переменной).

Например:

var animal = 'kitty';
var result = (animal === 'kitty') ? 'cute' : 'still nice';

В этом случае result получает «милое» значение, потому что значение животного - «котенок». Если бы у животного была другая ценность, результат получил бы «еще приятную» ценность.

Сравните это с тем, что хотел бы использовать код с условиями if/else .

var animal = 'kitty';
var result = '';
if (animal === 'kitty') {
    result = 'cute';
} else {
    result = 'still nice';
}

Условия if или else могут иметь несколько операций. В этом случае оператор возвращает результат последнего выражения.

var a = 0;
var str = 'not a';
var b = '';
b = a === 0 ? (a = 1, str += ' test') : (a = 2);

Поскольку a равно 0, оно становится равным 1 , а str становится «не тестом». Операция, в которой участвовала str была последней, поэтому b получает результат операции, то есть значение, содержащееся в str , т.е. «не тест».

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

var a = 1;
a === 1 ? alert('Hey, it is 1!') : 0;

Как видите, if (a === 1) alert('Hey, it is 1!'); будет делать то же самое. Было бы просто символ больше, так как он не требует обязательного else условия. Если было выполнено условие else , троичный метод был бы намного чище.

a === 1 ? alert('Hey, it is 1!') : alert('Weird, what could it be?');
if (a === 1) alert('Hey, it is 1!') else alert('Weird, what could it be?');

Тернары могут быть вложены для инкапсуляции дополнительной логики. Например

foo ? bar ? 1 : 2 : 3

// To be clear, this is evaluated left to right 
// and can be more explicitly expressed as:

foo ? (bar ? 1 : 2) : 3

Это то же самое, что и if/else

if (foo) {
  if (bar) {
    1
  } else {
    2
  }
} else {
  3
}

Стилистически это следует использовать только с короткими именами переменных, поскольку многострочные троицы могут значительно уменьшить читаемость.

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

var animal = 'kitty';
for (var i = 0; i < 5; ++i) {
    (animal === 'kitty') ? break:console.log(i);
}

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

var animal = 'kitty';
(animal === 'kitty') ? return 'meow' : return 'woof';

Чтобы сделать это правильно, вы вернете тройку следующим образом:

var animal = 'kitty';
return (animal === 'kitty') ? 'meow' : 'woof';

стратегия

Шаблон стратегии может использоваться во многих случаях в Javascript для замены оператора switch. Это особенно полезно, когда количество условий является динамическим или очень большим. Это позволяет коду для каждого условия быть независимым и отдельно проверяемым.

Объект стратегии - простой объект с несколькими функциями, представляющий каждое отдельное условие. Пример:

const AnimalSays = {
    dog () {
        return 'woof';
    },

    cat () {
        return 'meow';
    },

    lion () {
        return 'roar';
    },

    // ... other animals

    default () {
        return 'moo';
    }
};

Вышеуказанный объект можно использовать следующим образом:

function makeAnimalSpeak (animal) {
    // Match the animal by type
    const speak = AnimalSays[animal] || AnimalSays.default;
    console.log(animal + ' says ' + speak());
}

Результаты:

makeAnimalSpeak('dog') // => 'dog says woof'
makeAnimalSpeak('cat') // => 'cat says meow'
makeAnimalSpeak('lion') // => 'lion says roar'
makeAnimalSpeak('snake') // => 'snake says moo'

В последнем случае наша функция по умолчанию обрабатывает любые отсутствующие животные.

Используя || и && короткое замыкание

Булевы операторы || и && будет «короткое замыкание» и не будет оценивать второй параметр, если первое значение истинно или ложно соответственно. Это можно использовать для написания коротких условных обозначений типа:

var x = 10

x == 10 && alert("x is 10")
x == 10 || alert("x is not 10")


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow