|
1 | 1 | # Логические операторы |
2 | 2 |
|
3 | | -В JavaScript есть четыре логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ), `??` (Оператор нулевого слияния). Здесь мы рассмотрим первые три, оператор `??` будет в следующей статье. |
| 3 | +В JavaScript есть семь логических операторов: |
| 4 | + |
| 5 | +- `||` (ИЛИ) |
| 6 | + - `||=` (Оператор логического присваивания ИЛИ) |
| 7 | +- `&&` (И) |
| 8 | + - `&&=` (Оператор логического присваивания И) |
| 9 | +- `!` (НЕ) |
| 10 | +- `??` (Оператор нулевого слияния) |
| 11 | + - `??=` (Оператор нулевого присваивания) |
| 12 | + |
| 13 | +Здесь мы рассмотрим первые пять, операторы `??` и `??=` будет в следующей статье. |
4 | 14 |
|
5 | 15 | Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип. |
6 | 16 |
|
@@ -64,7 +74,7 @@ if (hour < 10 || hour > 18 || isWeekend) { |
64 | 74 | } |
65 | 75 | ``` |
66 | 76 |
|
67 | | -## ИЛИ "||" находит первое истинное значение [#or-finds-the-first-truthy-value] |
| 77 | +### ИЛИ "||" находит первое истинное значение [#or-finds-the-first-truthy-value] |
68 | 78 |
|
69 | 79 | Описанная выше логика соответствует традиционной. Теперь давайте поработаем с "дополнительными" возможностями JavaScript. |
70 | 80 |
|
@@ -133,6 +143,76 @@ alert( undefined || null || 0 ); // 0 (поскольку все ложно, в |
133 | 143 |
|
134 | 144 | Иногда люди используют эту возможность для выполнения инструкций только в том случае, если условие в левой части является ложным. |
135 | 145 |
|
| 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 | + |
136 | 216 | ## && (И) |
137 | 217 |
|
138 | 218 | Оператор И пишется как два амперсанда `&&`: |
@@ -170,7 +250,7 @@ if (1 && 0) { // вычисляется как true && false |
170 | 250 | ``` |
171 | 251 |
|
172 | 252 |
|
173 | | -## И "&&" находит первое ложное значение |
| 253 | +### И "&&" находит первое ложное значение |
174 | 254 |
|
175 | 255 | При нескольких подряд операторах И: |
176 | 256 |
|
@@ -244,6 +324,50 @@ if (x > 0) alert( 'x больше нуля!' ); |
244 | 324 | Несмотря на то, что вариант с `&&` кажется более коротким, `if` более нагляден и, как правило, более читабелен. Поэтому мы рекомендуем использовать каждую конструкцию по назначению: использовать `if`, если нам нужно `if`, и использовать `&&`, если нам нужно ИЛИ. |
245 | 325 | ```` |
246 | 326 |
|
| 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 | + |
247 | 371 | ## ! (НЕ) |
248 | 372 |
|
249 | 373 | Оператор НЕ представлен восклицательным знаком `!`. |
|
0 commit comments