Skip to content

Commit d02b5d7

Browse files
authored
Добавлено описание новых логических операторов: ||=, &&=
1 parent 1b7cc7a commit d02b5d7

File tree

1 file changed

+127
-3
lines changed
  • 1-js/02-first-steps/11-logical-operators

1 file changed

+127
-3
lines changed

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

Lines changed: 127 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
# Логические операторы
22

3-
В JavaScript есть четыре логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ), `??` (Оператор нулевого слияния). Здесь мы рассмотрим первые три, оператор `??` будет в следующей статье.
3+
В JavaScript есть семь логических операторов:
4+
5+
- `||` (ИЛИ)
6+
- `||=` (Оператор логического присваивания ИЛИ)
7+
- `&&` (И)
8+
- `&&=` (Оператор логического присваивания И)
9+
- `!` (НЕ)
10+
- `??` (Оператор нулевого слияния)
11+
- `??=` (Оператор нулевого присваивания)
12+
13+
Здесь мы рассмотрим первые пять, операторы `??` и `??=` будет в следующей статье.
414

515
Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип.
616

@@ -64,7 +74,7 @@ if (hour < 10 || hour > 18 || isWeekend) {
6474
}
6575
```
6676

67-
## ИЛИ "||" находит первое истинное значение [#or-finds-the-first-truthy-value]
77+
### ИЛИ "||" находит первое истинное значение [#or-finds-the-first-truthy-value]
6878

6979
Описанная выше логика соответствует традиционной. Теперь давайте поработаем с "дополнительными" возможностями JavaScript.
7080

@@ -133,6 +143,76 @@ alert( undefined || null || 0 ); // 0 (поскольку все ложно, в
133143

134144
Иногда люди используют эту возможность для выполнения инструкций только в том случае, если условие в левой части является ложным.
135145

146+
## ||= (Логическое присваивание ИЛИ)
147+
148+
[recent browser="new"]
149+
150+
Оператор логического присваивания ИЛИ `||=` записывается как обычный ИЛИ `||` с добавлением символа приваивания `=`. Такая запись не случайна, так как результат выполнения данного оператора напрямую зависит от действий уже известного нам `||`.
151+
152+
Вот его синтаксис:
153+
154+
```js
155+
a ||= b;
156+
```
157+
158+
Оператор `||=` принимает два операнда и выполняет следующие действия:
159+
160+
- Вычисляет операнды слева направо.
161+
- Конвертирует `a` в логическое значение.
162+
- Если `a` ложно, присваивает `a` значение `b`.
163+
164+
Концепция оператора `||=` заключается в «сокращённом вычислении», принцип работы которого мы разобрали ранее.
165+
166+
Теперь давайте перепишем `a ||= b` под вид «сокращённого вычисления»:
167+
168+
```js
169+
a || (a = b);
170+
```
171+
172+
Мы уже знаем, что ИЛИ `||` возвращает *первое истинное значение*, поэтому, если `a` является таковым, вычисление до правой части выражения не дойдёт.
173+
174+
Вот пример с очевидным использованием оператора `||=`:
175+
176+
```js run
177+
let johnHasCar = false;
178+
179+
johnHasCar ||= "У Джона нет машины!"; // то же самое, что false || (johnHasCar = "...")
180+
181+
alert( johnHasCar ); // "У Джона нет машины!"
182+
```
183+
184+
...А здесь происходит преобразование к логическому значению:
185+
186+
```js run
187+
let manufacturer = ""; // оператор ||= преобразует пустую строку "" к логическому значению false
188+
189+
manufacturer ||= "Неизвестный производитель"; // то же самое, что false || (manufacturer = "...")
190+
191+
alert( manufacturer ); // "Неизвестный производитель"
192+
```
193+
194+
Оператор логического присваивания ИЛИ `||=` -- это «[синтаксический сахар](https://ru.wikipedia.org/wiki/Синтаксический_сахар)», добавленный в язык в качестве более короткого варианта записи `if`-выражений с присваиванием.
195+
196+
Мы можем переписать приведённые выше примеры с использованием обычного `if`:
197+
198+
```js run
199+
let johnHasCar = false;
200+
201+
if (johnHasCar == false) {
202+
johnHasCar = "У Джона нет машины!";
203+
}
204+
205+
alert(johnHasCar); // "У Джона нет машины!"
206+
207+
let manufacturer = "";
208+
209+
if (manufacturer == false) {
210+
manufacturer = "Неизвестный производитель";
211+
}
212+
213+
alert(manufacturer); // "Неизвестный производитель"
214+
```
215+
136216
## && (И)
137217

138218
Оператор И пишется как два амперсанда `&&`:
@@ -170,7 +250,7 @@ if (1 && 0) { // вычисляется как true && false
170250
```
171251

172252

173-
## И "&&" находит первое ложное значение
253+
### И "&&" находит первое ложное значение
174254

175255
При нескольких подряд операторах И:
176256

@@ -244,6 +324,50 @@ if (x > 0) alert( 'x больше нуля!' );
244324
Несмотря на то, что вариант с `&&` кажется более коротким, `if` более нагляден и, как правило, более читабелен. Поэтому мы рекомендуем использовать каждую конструкцию по назначению: использовать `if`, если нам нужно `if`, и использовать `&&`, если нам нужно ИЛИ.
245325
````
246326

327+
## &&= (Логическое присваивание И)
328+
329+
[recent browser="new"]
330+
331+
Оператор логического присваивания И `&&=` записывается как два амперсанда `&&` и символ присваивания `=`.
332+
333+
Вот его синтаксис:
334+
335+
```js
336+
a &&= b;
337+
```
338+
339+
Принцип действия `&&=` практически такой же, как и у оператора логического присваивания ИЛИ `||=`. Единственное отличие заключается в том, что `&&=` присвоит `a` значение `b` только в том случае, если `a` *истинно*.
340+
341+
Концепция оператора логического присваивания И `&&=` также основывается на «сокращённом вычислении»:
342+
343+
```js
344+
a && (a = b);
345+
```
346+
347+
Пример использования:
348+
349+
```js run
350+
let greeting = "Привет"; // строка непустая, поэтому будет преобразована к логическому значению true оператором &&=
351+
352+
greeting &&= greeting + ", пользователь!"; // то же самое, что true && (greeting = greeting + "...")
353+
354+
alert( greeting ) // "Привет, пользователь!"
355+
```
356+
357+
Так как оператор логического присваивания И `&&=` также как и `||=` является «синтаксическим сахаром», мы можем без проблем переписать пример выше с использованием привычного для нас `if`:
358+
359+
```js run
360+
let greeting = "Привет";
361+
362+
if (greeting) {
363+
greeting = greeting + ", пользователь!"
364+
}
365+
366+
alert( greeting ) // "Привет, пользователь!"
367+
```
368+
369+
На практике, в отличие от `||=`, оператор `&&=` используется достаточно редко -- обычно, в комбинации с более сложными языковыми конструкциями, о которых мы будем говорить позже. Подобрать контекст для применения данного оператора -- довольно непростая задача.
370+
247371
## ! (НЕ)
248372

249373
Оператор НЕ представлен восклицательным знаком `!`.

0 commit comments

Comments
 (0)