Skip to content

Commit 0265fc7

Browse files
committed
Draft
1 parent 7b37e60 commit 0265fc7

1 file changed

Lines changed: 91 additions & 90 deletions

File tree

  • 1-js/02-first-steps/11-logical-operators
Lines changed: 91 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
# Logical operators
1+
# Логические операторы
22

3-
There are three logical operators in JavaScript: `||` (OR), `&&` (AND), `!` (NOT).
3+
В JavaScript представлены три логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ).
44

5-
Although they are called "logical", they can be applied to values of any type, not only boolean. Their result can also be of any type.
5+
Несмотря на своё название, данные операторы в состоянии применяться к значениям любых типов. Полученные результаты также могут иметь различный тип.
66

7-
Let's see the details.
7+
Давайте рассмотрим эту тему детальнее.
88

9-
## || (OR)
9+
## || (ИЛИ)
1010

11-
The "OR" operator is represented with two vertical line symbols:
11+
Оператор "ИЛИ" выглядит как двойной символ вертикальной черты:
1212

1313
```js
1414
result = a || b;
1515
```
1616

17-
In classical programming, the logical OR is meant to manipulate boolean values only. If any of its arguments are `true`, it returns `true`, otherwise it returns `false`.
17+
В классическом программировании ИЛИ предназначено только для манипулирования булевыми значениями: в случае, если какой-либо из аргументов `true`, он вернет `true`, в противной ситуации возвращается `false`.
1818

19-
In JavaScript, the operator is a little bit trickier and more powerful. But first, let's see what happens with boolean values.
19+
В JavaScript, как мы увидим далее, этот оператор работает несколько иным образом. Но давайте сперва посмотрим, что происходит с булевыми значениями.
2020

21-
There are four possible logical combinations:
21+
Существует всего четыре возможные логические комбинации:
2222

2323
```js run
2424
alert( true || true ); // true
@@ -27,21 +27,21 @@ alert( true || false ); // true
2727
alert( false || false ); // false
2828
```
2929

30-
As we can see, the result is always `true` except for the case when both operands are `false`.
30+
Как мы можем наблюдать, результат операций всегда равен `true`, за исключением случая, когда оба аргумента `false`.
3131

32-
If an operand is not a boolean, it's converted to a boolean for the evaluation.
32+
Если значение не логического типа, то оно к нему приводится в целях вычислений.
3333

34-
For instance, the number `1` is treated as `true`, the number `0` as `false`:
34+
Например, число `1` будет воспринято как `true`, а `0` – как `false`:
3535

3636
```js run
37-
if (1 || 0) { // works just like if( true || false )
37+
if (1 || 0) { // работает как if( true || false )
3838
alert( 'truthy!' );
3939
}
4040
```
4141

42-
Most of the time, OR `||` is used in an `if` statement to test if *any* of the given conditions is `true`.
42+
Обычно оператор `||` используется в `if` для проверки истинности любого из заданных условий.
4343

44-
For example:
44+
К примеру:
4545

4646
```js run
4747
let hour = 9;
@@ -53,57 +53,57 @@ if (hour < 10 || hour > 18) {
5353
}
5454
```
5555

56-
We can pass more conditions:
56+
Можно передать и больше условий:
5757

5858
```js run
5959
let hour = 12;
6060
let isWeekend = true;
6161

6262
if (hour < 10 || hour > 18 || isWeekend) {
63-
alert( 'The office is closed.' ); // it is the weekend
63+
alert( 'The office is closed.' ); // 'это выходной'
6464
}
6565
```
6666

67-
## OR finds the first truthy value
67+
## ИЛИ находит первое истинное значение
6868

69-
The logic described above is somewhat classical. Now, let's bring in the "extra" features of JavaScript.
69+
Описанная выше логика соответствует классической. Теперь давайте поработаем с "дополнительными" возможностями JavaScript.
7070

71-
The extended algorithm works as follows.
71+
Расширенный алгоритм работает следующим образом.
7272

73-
Given multiple OR'ed values:
73+
Учитывается несколько значений ИЛИ:
7474

7575
```js
7676
result = value1 || value2 || value3;
7777
```
7878

79-
The OR `||` operator does the following:
79+
Оператор `||` выполняет следующие действия:
8080

81-
- Evaluates operands from left to right.
82-
- For each operand, converts it to boolean. If the result is `true`, stops and returns the original value of that operand.
83-
- If all operands have been evaluated (i.e. all were `false`), returns the last operand.
81+
- Вычисляет операнды слева направо.
82+
- Каждый операнд конвертирует в логическое значение. Если результат `true`, останавливается и возвращает исходное значение этого операнда.
83+
- Если все операнды были "ложными" (`false`), возвращает последний из них.
8484

85-
A value is returned in its original form, without the conversion.
85+
Значение возвращается в исходном виде, без преобразования.
8686

87-
In other words, a chain of OR `"||"` returns the first truthy value or the last one if no such value is found.
87+
Другими словами, цепочка ИЛИ `"||"` возвращает первое истинное значение или последнее, если такое значение не найдено.
8888

89-
For instance:
89+
Например:
9090

9191
```js run
92-
alert( 1 || 0 ); // 1 (1 is truthy)
93-
alert( true || 'no matter what' ); // (true is truthy)
92+
alert( 1 || 0 ); // 1
93+
alert( true || 'no matter what' ); // true
9494

95-
alert( null || 1 ); // 1 (1 is the first truthy value)
96-
alert( null || 0 || 1 ); // 1 (the first truthy value)
97-
alert( undefined || null || 0 ); // 0 (all falsy, returns the last value)
95+
alert( null || 1 ); // 1 (первое истинное значение)
96+
alert( null || 0 || 1 ); // 1 (первое истинное значение)
97+
alert( undefined || null || 0 ); // 0 (поскольку все ложно, возвращается последнее значение)
9898
```
9999

100-
This leads to some interesting usage compared to a "pure, classical, boolean-only OR".
100+
Это более интересное применение оператора по сравнению с "чистым, классическим, только булевым ИЛИ".
101101

102-
1. **Getting the first truthy value from a list of variables or expressions.**
102+
1. **Получение первого истинного значения из списка переменных или выражений.**
103103

104-
Imagine we have several variables which can either contain data or be `null/undefined`. How can we find the first one with data?
104+
Представьте, что у нас имеется несколько переменных, которые могут содержать данные или быть `null/undefined`. Как мы можем найти первую переменную с данными?
105105

106-
We can use OR `||`:
106+
С помощью `||`:
107107

108108
```js run
109109
let currentUser = null;
@@ -113,27 +113,27 @@ This leads to some interesting usage compared to a "pure, classical, boolean-onl
113113
let name = currentUser || defaultUser || "unnamed";
114114
*/!*
115115

116-
alert( name ); // selects "John" – the first truthy value
116+
alert( name ); // выбирается "John" – первое истинное значение
117117
```
118118

119-
If both `currentUser` and `defaultUser` were falsy, `"unnamed"` would be the result.
120-
2. **Short-circuit evaluation.**
119+
Если бы и `currentUser`, и `defaultUser` были ложными, в качестве результата мы бы наблюдали `"unnamed"`.
120+
2. **Выполнение короткого замыкания.**
121121

122-
Operands can be not only values, but arbitrary expressions. OR evaluates and tests them from left to right. The evaluation stops when a truthy value is reached, and the value is returned. This process is called "a short-circuit evaluation" because it goes as short as possible from left to right.
122+
Операнды могут быть как отдельные значения, так и произвольные выражения. ИЛИ вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Такое поведение называется "коротким замыканием", поскольку второй операнд вычисляется только в том случае, если первого не достаточно для вычисления всего выражения.
123123

124-
This is clearly seen when the expression given as the second argument has a side effect like a variable assignment.
124+
Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет изменение состояния, такое как присвоение переменной.
125125

126-
In the example below, `x` does not get assigned:
126+
В приведенном ниже примере `x` не изменяется:
127127

128128
```js run no-beautify
129129
let x;
130130
131131
*!*true*/!* || (x = 1);
132132
133-
alert(x); // undefined, because (x = 1) not evaluated
133+
alert(x); // undefined, потому что (x = 1) не вычисляется
134134
```
135135

136-
If, instead, the first argument is `false`, `||` evaluates the second one, thus running the assignment:
136+
Если бы первый аргумент имел значение `false`, то `||` приступил бы к вычислению второго и выполнил операцию присваивания:
137137

138138
```js run no-beautify
139139
let x;
@@ -143,21 +143,21 @@ This leads to some interesting usage compared to a "pure, classical, boolean-onl
143143
alert(x); // 1
144144
```
145145

146-
An assignment is a simple case. Other side effects can also be involved.
146+
Присвоение -  простой случай. Могут быть и другие.
147147

148-
As we can see, such a use case is a "shorter way of doing `if`". The first operand is converted to boolean. If it's false, the second one is evaluated.
148+
Как мы видим, этот вариант использования `||` является "аналогом `if`". Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго.
149149

150-
Most of time, it's better to use a "regular" `if` to keep the code easy to understand, but sometimes this can be handy.
150+
В большинстве случаев лучше использовать "обычный" `if`, чтобы облегчить понимание кода, но иногда это может быть удобно.
151151

152-
## && (AND)
152+
## && (И)
153153

154-
The AND operator is represented with two ampersands `&&`:
154+
Оператор И пишется как два амперсанда `&&`:
155155

156156
```js
157157
result = a && b;
158158
```
159159

160-
In classical programming, AND returns `true` if both operands are truthy and `false` otherwise:
160+
В классическом программировании И возвращает `true`, если оба аргумента истинны, а иначе – `false`:
161161

162162
```js run
163163
alert( true && true ); // true
@@ -166,7 +166,7 @@ alert( true && false ); // false
166166
alert( false && false ); // false
167167
```
168168

169-
An example with `if`:
169+
Пример с `if`:
170170

171171
```js run
172172
let hour = 12;
@@ -177,78 +177,79 @@ if (hour == 12 && minute == 30) {
177177
}
178178
```
179179

180-
Just as with OR, any value is allowed as an operand of AND:
180+
Как и в случае с ИЛИ, любое значение допускается в качестве операнда И:
181181

182182
```js run
183-
if (1 && 0) { // evaluated as true && false
183+
if (1 && 0) { // оценивается как true && false
184184
alert( "won't work, because the result is falsy" );
185185
}
186186
```
187187

188188

189-
## AND finds the first falsy value
189+
## И находит первое ложное значение
190190

191-
Given multiple AND'ed values:
191+
При наличии нескольких значений И:
192192

193193
```js
194194
result = value1 && value2 && value3;
195195
```
196196

197-
The AND `&&` operator does the following:
197+
Оператор `&&` выполняет следующие действия:
198198

199-
- Evaluates operands from left to right.
200-
- For each operand, converts it to a boolean. If the result is `false`, stops and returns the original value of that operand.
201-
- If all operands have been evaluated (i.e. all were truthy), returns the last operand.
199+
- Вычисляет операнды слева направо.
200+
- Каждый операнд преобразует в логическое значение. Если результат `false`, останавливается и возвращает исходное значение этого операнда.
201+
- Если все операнды были истинными, возвращается последний.
202202

203-
In other words, AND returns the first falsy value or the last value if none were found.
203+
Другими словами, И возвращает первое ложное значение. Или последнее, если ничего не найдено.
204204

205-
The rules above are similar to OR. The difference is that AND returns the first *falsy* value while OR returns the first *truthy* one.
205+
Вышеуказанные правила схожи с поведением ИЛИ. Разница в том, что И возвращает первое *ложное* значение, а ИЛИ -  первое *истинное*.
206206

207-
Examples:
207+
Примеры:
208208

209209
```js run
210-
// if the first operand is truthy,
211-
// AND returns the second operand:
210+
// Если первый операнд истинный,
211+
// И возвращает второй:
212212
alert( 1 && 0 ); // 0
213213
alert( 1 && 5 ); // 5
214214
215-
// if the first operand is falsy,
216-
// AND returns it. The second operand is ignored
215+
// Если первый операнд ложный,
216+
// И возвращает его. Второй операнд игнорируется
217217
alert( null && 5 ); // null
218218
alert( 0 && "no matter what" ); // 0
219219
```
220220

221-
We can also pass several values in a row. See how the first falsy one is returned:
221+
Можно передать несколько значений подряд. В таком случае возвратится первое "ложное" значение, на котором остановились вычисления.
222222

223223
```js run
224224
alert( 1 && 2 && null && 3 ); // null
225225
```
226226

227-
When all values are truthy, the last value is returned:
227+
Когда все значения верны, возвращается последнее
228228

229229
```js run
230-
alert( 1 && 2 && 3 ); // 3, the last one
230+
alert( 1 && 2 && 3 ); // 3
231231
```
232232

233-
````smart header="Precedence of AND `&&` is higher than OR `||`"
234-
The precedence of AND `&&` operator is higher than OR `||`.
233+
````smart header="Приоритет оператора `&&` больше, чем у `||`"
234+
Приоритет оператора И `&&` больше, чем ИЛИ `||`, так что он выполняется раньше.
235235

236-
So the code `a && b || c && d` is essentially the same as if the `&&` expressions were in parentheses: `(a && b) || (c && d)`.
236+
Таким образом, код `a && b || c && d` по существу такой же, как если бы выражения `&&` были в круглых скобках: `(a && b) || (c && d)`.
237237
````
238238

239-
Just like OR, the AND `&&` operator can sometimes replace `if`.
239+
Как и оператор ИЛИ, И `&&` иногда может заменять `if`.
240240

241-
For instance:
241+
К примеру:
242242

243243
```js run
244244
let x = 1;
245245
246246
(x > 0) && alert( 'Greater than zero!' );
247247
```
248248

249-
The action in the right part of `&&` would execute only if the evaluation reaches it. That is, only if `(x > 0)` is true.
249+
Действие в правой части `&&` выполнится только в том случае, если до него дойдут вычисления. То есть, `alert` сработает, если в левой части будет `true`.
250250

251-
So we basically have an analogue for:
251+
252+
Получился аналог:
252253

253254
```js run
254255
let x = 1;
@@ -258,46 +259,46 @@ if (x > 0) {
258259
}
259260
```
260261

261-
The variant with `&&` appears shorter. But `if` is more obvious and tends to be a little bit more readable.
262+
Однако, как правило, вариант с `if` лучше читается и воспринимается.
262263

263-
So we recommend using every construct for its purpose: use `if` if we want if and use `&&` if we want AND.
264+
Он более очевиден, поэтому лучше использовать его.
264265

265-
## ! (NOT)
266+
## ! (НЕ)
266267

267-
The boolean NOT operator is represented with an exclamation sign `!`.
268+
Оператор НЕ представлен восклицательным знаком `!`.
268269

269-
The syntax is pretty simple:
270+
Синтаксис довольно прост:
270271

271272
```js
272273
result = !value;
273274
```
274275

275-
The operator accepts a single argument and does the following:
276+
Оператор принимает один аргумент и выполняет следующие действия:
276277

277-
1. Converts the operand to boolean type: `true/false`.
278-
2. Returns the inverse value.
278+
1. Сначала приводит аргумент к логическому типу `true/false`.
279+
2. Затем возвращает противоположное значение.
279280

280-
For instance:
281+
Например:
281282

282283
```js run
283284
alert( !true ); // false
284285
alert( !0 ); // true
285286
```
286287

287-
A double NOT `!!` is sometimes used for converting a value to boolean type:
288+
В частности, двойное НЕ используют для преобразования значений к логическому типу:
288289

289290
```js run
290291
alert( !!"non-empty string" ); // true
291292
alert( !!null ); // false
292293
```
293294

294-
That is, the first NOT converts the value to boolean and returns the inverse, and the second NOT inverses it again. In the end, we have a plain value-to-boolean conversion.
295+
То есть первое НЕ преобразует значение в логическое значение и возвращает обратное, а второе НЕ снова инвертирует его. В конце мы имеем простое преобразование значения в логическое.
295296

296-
There's a little more verbose way to do the same thing -- a built-in `Boolean` function:
297+
Есть немного более подробный способ сделать то же самое - встроенная `Boolean` функция:
297298

298299
```js run
299300
alert( Boolean("non-empty string") ); // true
300301
alert( Boolean(null) ); // false
301302
```
302303

303-
The precedence of NOT `!` is the highest of all logical operators, so it always executes first, before `&&` or `||`.
304+
Приоритет НЕ `!` является наивысшим из всех логических операторов, поэтому он всегда выполняется первым, перед `&&` или `||`.

0 commit comments

Comments
 (0)