Поиск…
Вступление
Условные выражения, включающие ключевые слова, такие как 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")