You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -101,53 +101,37 @@ alert( undefined || null || 0 ); // 0 (поскольку все ложно, в
101
101
102
102
1.**Получение первого истинного значения из списка переменных или выражений.**
103
103
104
-
Представим, что у нас имеется ряд переменных, которые могут содержать данные или быть `null/undefined`. Как мы можем найти первую переменную с данными?
104
+
Например, у нас есть переменные `firstName`, `lastName` и `nickName`, все они необязательные (т.е. они могут быть неопределенными или иметь ложные значения).
105
105
106
-
С помощью `||`:
106
+
Давайте воспользуемся оператором ИЛИ `||`, чтобы выбрать ту переменную, в которой есть данные, и показать её (или "Аноним", если ни в одной переменной данных нет):
107
107
108
108
```js run
109
-
let currentUser =null;
110
-
let defaultUser ="John";
111
-
112
-
*!*
113
-
let name = currentUser || defaultUser ||"unnamed";
114
-
*/!*
115
-
116
-
alert( name ); // выбирается "John" – первое истинное значение
Если бы и `currentUser`, и `defaultUser`были ложными, в качестве результата мы бы наблюдали `"unnamed"`.
116
+
Если бы все переменные были ложными, в качестве результата мы бы наблюдали `"Аноним"`.
120
117
2.**Сокращённое вычисление.**
121
118
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
+
Ещё одной отличительной особенностью оператора ИЛИ `||` является так называемое «сокращённое вычисление».
135
120
136
-
Если бы первый аргумент имел значение `false`, то `||` приступил бы к вычислению второго и выполнил операцию присваивания:
121
+
Это означает, что ИЛИ `||` обрабатывает свои операнды до тех пор, пока не будет достигнуто первое истинностное значение, и затем это значение сразу же возвращается, даже не затрагивая другие операнды.
137
122
138
-
```js run no-beautify
139
-
let x;
123
+
Важность этой особенности становится очевидной, если операнд -- это не просто значение, а выражение с сопутствующим эффектом, как, например, присваивание переменной или вызов функции.
140
124
141
-
*!*false*/!* || (x = 1);
125
+
В приведенном ниже примере срабатывает только второй `alert`:
142
126
143
-
alert(x); // 1
127
+
```js run
128
+
*!*true*/!* || alert("никогда не сработает");
129
+
*!*false*/!* || alert("сработает");
144
130
```
145
131
146
-
Присваивание - лишь один пример. Конечно, могут быть и другие побочные эффекты, которые не проявятся, если вычисление до них не дойдёт.
147
-
148
-
Как мы видим, этот вариант использования `||` является "аналогом `if`". Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго.
132
+
В первой строке оператор ИЛИ `||` останавливает выполнение сразу после того, как сталкивается с истинным значением (`true`), поэтому сообщение не показывается.
149
133
150
-
В большинстве случаев лучше использовать "обычный"`if`, чтобы облегчить понимание кода, но иногда это может быть удобно.
134
+
Иногда люди используют эту возможность для выполнения инструкций только в том случае, если условие в левой части является ложным.
151
135
152
136
## && (И)
153
137
@@ -236,32 +220,29 @@ alert( 1 && 2 && 3 ); // 3
236
220
Таким образом, код `a && b || c && d` по существу такой же, как если бы выражения `&&` были в круглых скобках:`(a && b) || (c && d)`.
237
221
````
238
222
239
-
Как и оператор ИЛИ `||`, И `&&` иногда может заменять `if`.
223
+
````warn header="Не заменяйте `if` на `||` или `&&`"
224
+
Иногда люди используют оператор И `&&` как «более короткий способ записи if-выражения».
240
225
241
-
К примеру:
226
+
Например:
242
227
243
228
```js run
244
229
let x = 1;
245
230
246
-
(x > 0) && alert( 'Greater than zero!' );
231
+
(x > 0) && alert( 'x больше нуля!' );
247
232
```
248
233
249
-
Действие в правой части `&&`выполнится только в том случае, если до него дойдут вычисления. То есть, `alert` сработает, если в левой части (`x > 0)`будет `true`.
234
+
Инструкция в правой части `&&`будет выполнена только в том случае, если вычисление дойдет до нее. То есть, только если `(x > 0)`истинно.
250
235
251
-
252
-
Получился аналог:
236
+
Таким образом, мы имеем аналог для следующего кода:
253
237
254
238
```js run
255
239
let x = 1;
256
240
257
-
if (x > 0) {
258
-
alert( 'Greater than zero!' );
259
-
}
241
+
if (x > 0) alert( 'x больше нуля!' );
260
242
```
261
243
262
-
Однако, как правило, вариант с `if` лучше читается и воспринимается.
263
-
264
-
Он более очевиден, поэтому лучше использовать его.
244
+
Несмотря на то, что вариант с `&&` кажется более коротким, `if` более нагляден и, как правило, более читабелен. Поэтому мы рекомендуем использовать каждую конструкцию по назначению: использовать `if`, если нам нужно `if`, и использовать `&&`, если нам нужно ИЛИ.
0 commit comments