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
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/11-logical-operators/article.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Логические операторы
2
2
3
-
В JavaScript есть три логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ).
3
+
В JavaScript есть четыре логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ), `??` (Оператор нулевого слияния). Здесь мы рассмотрим первые три, оператор `??` будет в следующей статье.
4
4
5
5
Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип.
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/12-nullish-coalescing-operator/article.md
+18-15Lines changed: 18 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,10 +2,10 @@
2
2
3
3
[recent browser="new"]
4
4
5
-
В этой статье мы будем говорить, что значение выражения "определено", если оно отличается от `null` или `undefined`.
6
-
7
5
Оператор нулевого слияния представляет собой два вопросительных знака `??`.
8
6
7
+
Так как он рассматривает `null` и `undefined` аналогично, мы введём специальный термин. Мы будем говорить, что выражение "определено", только если оно не равняется ни `null`, ни `undefined`.
8
+
9
9
Результат выражения `a ?? b` будет следующим:
10
10
-`a`, если значение `a` определено,
11
11
-`b`, если значение `a` не определено.
@@ -20,29 +20,31 @@
20
20
result = (a !==null&& a !==undefined) ? a : b;
21
21
```
22
22
23
+
Теперь должно быть абсолютно ясно, что `??` делает. Давайте посмотрим, где это может быть полезно.
24
+
23
25
Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально неопределённой переменной.
24
26
25
-
Например, в следующем примере, если переменная `user` не определена, покажем модальное окно с надписью`Аноним`:
27
+
Например, здесь мы отобразим `user`, если он определен, в противном случае`Аноним`:
26
28
27
29
```js run
28
30
let user;
29
31
30
-
alert(user ??"Аноним"); // Аноним
32
+
alert(user ??"Аноним"); // Аноним (user не определен)
31
33
```
32
34
33
-
Конечно, если бы переменная `user` содержала любое значение, кроме `null/undefined`, то мы бы увидели его:
35
+
Вот пример `user`, с присвоенным именем:
34
36
35
37
```js run
36
38
let user ="Иван";
37
39
38
-
alert(user ??"Аноним"); // Иван
40
+
alert(user ??"Аноним"); // Иван (user определен)
39
41
```
40
42
41
43
Кроме этого, можно записать последовательность из операторов `??`, чтобы получить первое значение из списка, которое не является `null/undefined`.
42
44
43
-
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть неопределёнными, если отсутствует соответствующая информация.
45
+
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть не определены, если пользователь решил не вводить значение.
44
46
45
-
Выведем имя пользователя, используя одну из этих переменных, а в случае если все они не определены, то покажем "Аноним".
47
+
Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Анонимный", если все они не определены.
Оператор ИЛИ `||` существует с самого появления JavaScript, поэтому ранее для решения похожих задач разработчики использовали именно его.
79
+
Исторически сложилось так, что оператор ИЛИ `||`появился первым. Он существует с самого начала существования JavaScript, поэтому разработчики долгое время использовали его для таких целей.
78
80
79
81
С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??` как раз потому, что многие были недовольны оператором `||`.
80
82
@@ -95,17 +97,18 @@ alert(height || 100); // 100
95
97
alert(height ??100); // 0
96
98
```
97
99
98
-
- `height ||100` проверяет, имеет ли переменная `height`ложное значение, что так и есть,
99
-
- поэтому результатом является второй аргумент, т.е. `100`.
100
+
- `height ||100` проверяет`height`на наличие ложного значения, оно равно `0`, так что это действительно false.
101
+
- поэтому результатом `||`является второй аргумент, т.е. `100`.
100
102
- `height ??100` проверяет, что переменная `height` содержит `null/undefined`, а поскольку это не так,
101
103
- то результатом является сама переменная `height`, т.е. `0`.
102
104
103
-
Если нулевая высота является "нормальным" значением, которое не должно заменяться значением по умолчанию, то оператор`??` делает как раз то, что нужно.
105
+
На практике нулевая высота часто является вполне возможным значением, которое не следует заменять значением по умолчанию. Таким образом,`??` делает все правильно.
104
106
105
107
## Приоритет
106
108
107
-
Оператор `??` имеет довольно низкий приоритет: `4`, согласно [таблице на MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table).
108
-
Таким образом, оператор `??` вычисляется до `=` и `?`, но после большинства других операций, таких как `+`, `*`.
109
+
Приоритет оператора `??` такой же, как и у `||`. Они оба равны `4` в [таблице на MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table).
110
+
111
+
Это означает, что, как и `||`, оператор нулевого слияния `??` вычисляется до `=` и `?`, но после большинства других операций, таких как `+`, `*`.
109
112
110
113
Из этого следует, что если нужно выбрать значение при помощи оператора `??` вместе с другими операторами в выражении, следует добавить круглые скобки:
111
114
@@ -139,7 +142,7 @@ let area = height ?? (100 * width) ?? 50;
139
142
let x =1&&2??3; // Синтаксическая ошибка
140
143
```
141
144
142
-
Это довольно спорное ограничение, которое было описано в спецификации языка, чтобы избежать ошибок при замене оператора`||` на `??`.
145
+
Ограничение безусловно спорное, оно было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переключаться с`||` на `??`.
143
146
144
147
Используйте круглые скобки, чтобы обойти это ограничение:
0 commit comments