Skip to content

Commit c37912c

Browse files
authored
Улучшение статьи «Логические операторы»
1 parent df2cd5b commit c37912c

File tree

1 file changed

+28
-47
lines changed
  • 1-js/02-first-steps/11-logical-operators

1 file changed

+28
-47
lines changed

1-js/02-first-steps/11-logical-operators/article.md

Lines changed: 28 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ result = value1 || value2 || value3;
8989
Например:
9090

9191
```js run
92-
alert( 1 || 0 ); // 1
93-
alert( true || 'no matter what' ); // true
92+
alert( 1 || 0 ); // 1 (1 - истинное значение)
93+
alert( true || 'какая-то строка' ); // true
9494

9595
alert( null || 1 ); // 1 (первое истинное значение)
9696
alert( null || 0 || 1 ); // 1 (первое истинное значение)
@@ -101,53 +101,37 @@ alert( undefined || null || 0 ); // 0 (поскольку все ложно, в
101101

102102
1. **Получение первого истинного значения из списка переменных или выражений.**
103103

104-
Представим, что у нас имеется ряд переменных, которые могут содержать данные или быть `null/undefined`. Как мы можем найти первую переменную с данными?
104+
Например, у нас есть переменные `firstName`, `lastName` и `nickName`, все они необязательные (т.е. они могут быть неопределенными или иметь ложные значения).
105105

106-
С помощью `||`:
106+
Давайте воспользуемся оператором ИЛИ `||`, чтобы выбрать ту переменную, в которой есть данные, и показать её (или "Аноним", если ни в одной переменной данных нет):
107107

108108
```js run
109-
let currentUser = null;
110-
let defaultUser = "John";
111-
112-
*!*
113-
let name = currentUser || defaultUser || "unnamed";
114-
*/!*
115-
116-
alert( name ); // выбирается "John" – первое истинное значение
109+
let firstName = "";
110+
let lastName = "";
111+
let nickName = "Суперкодер";
112+
113+
*!*alert( firstName || lastName || nickName || "Аноним"); // Суперкодер*/!*
117114
```
118115

119-
Если бы и `currentUser`, и `defaultUser` были ложными, в качестве результата мы бы наблюдали `"unnamed"`.
116+
Если бы все переменные были ложными, в качестве результата мы бы наблюдали `"Аноним"`.
120117
2. **Сокращённое вычисление.**
121118

122-
Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ `||` вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется "сокращённым вычислением", поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения.
123-
124-
Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет побочный эффект, например, изменение переменной.
125-
126-
В приведённом ниже примере `x` не изменяется:
127-
128-
```js run no-beautify
129-
let x;
130-
131-
*!*true*/!* || (x = 1);
132-
133-
alert(x); // undefined, потому что (x = 1) не вычисляется
134-
```
119+
Ещё одной отличительной особенностью оператора ИЛИ `||` является так называемое «сокращённое вычисление».
135120

136-
Если бы первый аргумент имел значение `false`, то `||` приступил бы к вычислению второго и выполнил операцию присваивания:
121+
Это означает, что ИЛИ `||` обрабатывает свои операнды до тех пор, пока не будет достигнуто первое истинностное значение, и затем это значение сразу же возвращается, даже не затрагивая другие операнды.
137122

138-
```js run no-beautify
139-
let x;
123+
Важность этой особенности становится очевидной, если операнд -- это не просто значение, а выражение с сопутствующим эффектом, как, например, присваивание переменной или вызов функции.
140124

141-
*!*false*/!* || (x = 1);
125+
В приведенном ниже примере срабатывает только второй `alert`:
142126

143-
alert(x); // 1
127+
```js run
128+
*!*true*/!* || alert("никогда не сработает");
129+
*!*false*/!* || alert("сработает");
144130
```
145131

146-
Присваивание - лишь один пример. Конечно, могут быть и другие побочные эффекты, которые не проявятся, если вычисление до них не дойдёт.
147-
148-
Как мы видим, этот вариант использования `||` является "аналогом `if`". Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго.
132+
В первой строке оператор ИЛИ `||` останавливает выполнение сразу после того, как сталкивается с истинным значением (`true`), поэтому сообщение не показывается.
149133

150-
В большинстве случаев лучше использовать "обычный" `if`, чтобы облегчить понимание кода, но иногда это может быть удобно.
134+
Иногда люди используют эту возможность для выполнения инструкций только в том случае, если условие в левой части является ложным.
151135

152136
## && (И)
153137

@@ -236,32 +220,29 @@ alert( 1 && 2 && 3 ); // 3
236220
Таким образом, код `a && b || c && d` по существу такой же, как если бы выражения `&&` были в круглых скобках: `(a && b) || (c && d)`.
237221
````
238222

239-
Как и оператор ИЛИ `||`, И `&&` иногда может заменять `if`.
223+
````warn header="Не заменяйте `if` на `||` или `&&`"
224+
Иногда люди используют оператор И `&&` как «более короткий способ записи if-выражения».
240225

241-
К примеру:
226+
Например:
242227

243228
```js run
244229
let x = 1;
245230
246-
(x > 0) && alert( 'Greater than zero!' );
231+
(x > 0) && alert( 'x больше нуля!' );
247232
```
248233

249-
Действие в правой части `&&` выполнится только в том случае, если до него дойдут вычисления. То есть, `alert` сработает, если в левой части (`x > 0)` будет `true`.
234+
Инструкция в правой части `&&` будет выполнена только в том случае, если вычисление дойдет до нее. То есть, только если `(x > 0)` истинно.
250235

251-
252-
Получился аналог:
236+
Таким образом, мы имеем аналог для следующего кода:
253237

254238
```js run
255239
let x = 1;
256240
257-
if (x > 0) {
258-
alert( 'Greater than zero!' );
259-
}
241+
if (x > 0) alert( 'x больше нуля!' );
260242
```
261243

262-
Однако, как правило, вариант с `if` лучше читается и воспринимается.
263-
264-
Он более очевиден, поэтому лучше использовать его.
244+
Несмотря на то, что вариант с `&&` кажется более коротким, `if` более нагляден и, как правило, более читабелен. Поэтому мы рекомендуем использовать каждую конструкцию по назначению: использовать `if`, если нам нужно `if`, и использовать `&&`, если нам нужно ИЛИ.
245+
````
265246

266247
## ! (НЕ)
267248

0 commit comments

Comments
 (0)