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/12-nullish-coalescing-operator/article.md
+14-16Lines changed: 14 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,15 +2,15 @@
2
2
3
3
[recent browser="new"]
4
4
5
-
В этой статье мы считаем выражение "определённым", если его значение отличается от `null` или `undefined`.
5
+
В этой статье мы будем говорить, что значение выражение "определено", если оно отличается от `null` или `undefined`.
6
6
7
7
Оператор объединения с null представляет собой два вопросительных знака `??`.
8
8
9
9
Результат выражения `a ?? b` будет следующим:
10
-
-`a`, если `a`— определённое значение,
10
+
-`a`, если значение `a`определено,
11
11
-`b`, если значение `a` не определено.
12
12
13
-
То есть оператор `??` возвращает первый аргумент, если он определён, и второй — в противном случае.
13
+
То есть оператор `??` возвращает первый аргумент, если он не `null/undefined`, иначе второй.
14
14
15
15
Оператор объединения с null не является чем-то принципиально новым. Это всего лишь удобный синтаксис, как из двух значений получить одно "определённое".
16
16
@@ -20,7 +20,7 @@
20
20
result = (a !==null&& a !==undefined) ? a : b;
21
21
```
22
22
23
-
Как правило, оператор `??` нужен для того, чтобы определить значение по умолчанию для потенциально неопределённой переменной.
23
+
Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально неопределённой переменной.
24
24
25
25
Например, в следующем примере, если переменная `user` не определена, покажем модальное окно с надписью `Аноним`:
26
26
@@ -30,7 +30,7 @@ let user;
30
30
alert(user ??"Аноним"); // Аноним
31
31
```
32
32
33
-
Конечно, если бы переменная `user` содержала любое значение, кроме `null/undefined`, то мы бы увидели имя пользователя:
33
+
Конечно, если бы переменная `user` содержала любое значение, кроме `null/undefined`, то мы бы увидели его:
34
34
35
35
```js run
36
36
let user ="Иван";
@@ -40,7 +40,7 @@ alert(user ?? "Аноним"); // Иван
40
40
41
41
Кроме этого, можно записать последовательность из операторов `??`, чтобы получить первое вычислённое определённое значение из всего списка.
42
42
43
-
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть неопределёнными, если отсутствует информация в какой-либо из них.
43
+
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть неопределёнными, если отсутствует соответствующая информация.
44
44
45
45
Выведем имя пользователя, используя одну из этих переменных, а в случае если все они не определены, то покажем "Аноним".
Оператор ИЛИ `||` можно использовать для того же, что и `??`, как это было показано в [предыдущей главе](info:logical-operators#or-finds-the-first-truthy-value).
63
63
64
-
Например, в приведённом выше коде можно заменить `??` на `||` и получить тот же самый результат:
64
+
Например, если в приведённом выше коде заменить `??` на `||`, то будет тот же самый результат:
Оператор ИЛИ `||` существует с самого появления JavaScript, поэтому ранее для решения похожих задач разработчики использовали именно его.
78
78
79
-
С другой стороны, совсем не так давно появился оператор объединения с null `??` как раз потому, что не все были довольны оператором `||`.
79
+
С другой стороны, сравнительно недавно в язык был добавлен оператор объединения с null `??` как раз потому, что многие были недовольны оператором `||`.
80
80
81
-
Есть одно тонкое, но важное отличие:
81
+
Важное различие между ними заключается в том, что:
82
82
- `||` возвращает первое *истинное* значение.
83
83
- `??` возвращает первое *определённое* значение.
84
84
85
85
Проще говоря, оператор `||` не различает `false`, `0`, пустую строку `""` и `null/undefined`. Для него они все одинаковые, т.е. являются ложными значениями. Если первым аргументом для оператора `||` будет любое из перечисленных значений, то в качестве результата мы получим второй аргумент.
86
86
87
-
Однако на практике часто требуется использовать стандартное значение только тогда, когда переменная является `null/undefined`. Ведь именно тогда значение действительно неизвестно/не определено.
87
+
Однако на практике часто требуется использовать значение по умолчанию только тогда, когда переменная является `null/undefined`. Ведь именно тогда значение действительно неизвестно/не определено.
88
88
89
89
Например, рассмотрим следующий пример:
90
90
@@ -95,14 +95,12 @@ alert(height || 100); // 100
95
95
alert(height ??100); // 0
96
96
```
97
97
98
-
Итак, мы получили нулевую высоту.
99
-
100
98
- `height ||100` проверяет, имеет ли переменная `height` ложное значение, что так и есть,
101
99
- поэтому результатом является второй аргумент, т.е. `100`.
102
100
- `height ??100` проверяет, что переменная `height` содержит `null/undefined`, а поскольку это не так,
103
101
- то результатом является сама переменная `height`, т.е. `0`.
104
102
105
-
Если предположить, что нашим значением может быть нулевая высота, которая не должна заменяться значением по умолчанию, то оператор `??`— это то, что нам нужно.
103
+
Если нулевая высота является "нормальным" значением, которое не должно заменяться значением по умолчанию, то оператор `??`делает как раз то, что нужно.
106
104
107
105
## Приоритет
108
106
@@ -121,7 +119,7 @@ let area = (height ?? 100) * (width ?? 50);
121
119
alert(area); // 5000
122
120
```
123
121
124
-
Однако если опустить скобки, то оператор `*` выполнится первым, так как у него приоритет выше, чем у `??`, а это приведёт к неправильным результатам.
122
+
Иначе, если опустить скобки, то оператор `*` выполнится первым, так как у него приоритет выше, чем у `??`, а это приведёт к неправильным результатам.
125
123
126
124
```js
127
125
// без круглых скобок
@@ -155,7 +153,7 @@ alert(x); // 2
155
153
156
154
## Итого
157
155
158
-
- Оператор объединения с null `??` — это быстрый способ получить "определённое" значение из списка.
156
+
- Оператор объединения с null `??` — это быстрый способ выбрать первое "определённое" значение из списка.
159
157
160
158
Используется для присвоения переменным значений по умолчанию:
161
159
@@ -164,5 +162,5 @@ alert(x); // 2
164
162
height = height ??100;
165
163
```
166
164
167
-
- Оператор `??` имеет очень низкий приоритет, немного выше, чем у `?` и `=`, поэтому при использовании его в выражении возможно потребуются круглые скобки.
165
+
- Оператор `??` имеет очень низкий приоритет, лишь немного выше, чем у `?` и `=`, поэтому при использовании его в выражении, скорее всего, потребуются скобки.
168
166
- Запрещено использовать вместе с `||` или `&&` без явно указанных круглых скобок.
0 commit comments