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
+28-28Lines changed: 28 additions & 28 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,47 +4,47 @@
4
4
5
5
Оператор нулевого слияния представляет собой два вопросительных знака `??`.
6
6
7
-
Так как он рассматривает`null` и `undefined`аналогично, мы введём специальный термин. Мы будем говорить, что выражение "определено", только если оно не равняется ни `null`, ни `undefined`.
7
+
Так как он обрабатывает`null` и `undefined`одинаковым образом, то для этой статьи мы введём специальный термин. Для краткости будем говорить, что значение "определено", если оно не равняется ни `null`, ни `undefined`.
8
8
9
9
Результат выражения `a ?? b` будет следующим:
10
-
-`a`, если значение `a` определено,
11
-
-`b`, если значение `a` не определено.
10
+
-если `a` определено, то `a`,
11
+
- если `a` не определено, то `b`.
12
12
13
-
То есть оператор `??` возвращает первый аргумент, если он не `null/undefined`, иначе второй.
13
+
Иначе говоря, оператор `??` возвращает первый аргумент, если он не `null/undefined`, иначе второй.
14
14
15
-
Оператор нулевого слияния не является чем-то принципиально новым. Это всего лишь удобный синтаксис, как из двух значений получить одно "определённое".
15
+
Оператор нулевого слияния не является чем-то принципиально новым. Это всего лишь удобный синтаксис, как из двух значений получить одно, которое "определено".
16
16
17
17
Вот как можно переписать выражение `result = a ?? b`, используя уже знакомые нам операторы:
18
18
19
19
```js
20
20
result = (a !==null&& a !==undefined) ? a : b;
21
21
```
22
22
23
-
Теперь должно быть абсолютно ясно, что `??` делает. Давайте посмотрим, где это может быть полезно.
23
+
Теперь должно быть абсолютно ясно, что делает `??`. Давайте посмотрим, где это может быть полезно.
24
24
25
-
Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально неопределённой переменной.
25
+
Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально не с переменной.
26
26
27
-
Например, здесь мы отобразим `user`, если он определен, в противном случае `Аноним`:
27
+
Например, здесь мы отобразим `user`, если её значение не `null/undefined`, в противном случае `Аноним`:
28
28
29
29
```js run
30
30
let user;
31
31
32
-
alert(user ??"Аноним"); // Аноним (user не определен)
32
+
alert(user ??"Аноним"); // Аноним (user не существует)
33
33
```
34
34
35
-
Вот пример`user`, с присвоенным именем:
35
+
А вот пример, когда `user` присвоено значение:
36
36
37
37
```js run
38
38
let user ="Иван";
39
39
40
-
alert(user ??"Аноним"); // Иван (user определен)
40
+
alert(user ??"Аноним"); // Иван (user существует)
41
41
```
42
42
43
43
Кроме этого, можно записать последовательность из операторов `??`, чтобы получить первое значение из списка, которое не является `null/undefined`.
44
44
45
-
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть не определены, если пользователь решил не вводить значение.
45
+
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут не существовать, если пользователь решил не вводить соответствующие значение.
46
46
47
-
Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Анонимный", если все они не определены.
47
+
Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Аноним", если все они `null/undefined`.
48
48
49
49
Для этого воспользуемся оператором `??`:
50
50
@@ -53,7 +53,7 @@ let firstName = null;
53
53
let lastName =null;
54
54
let nickName ="Суперкодер";
55
55
56
-
// показывает первое определённое значение:
56
+
// показывает первое значение, которое определено:
Исторически сложилось так, что оператор ИЛИ `||` появился первым. Он существует с самого начала существования JavaScript, поэтому разработчики долгое время использовали его для таких целей.
79
+
Исторически сложилось так, что оператор ИЛИ `||` появился первым. Он существует с самого начала в JavaScript, поэтому разработчики долгое время использовали его для таких целей.
80
80
81
-
С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??` как раз потому, что многие были недовольны оператором `||`.
81
+
С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??`- как раз потому, что многие были недовольны оператором `||`.
82
82
83
83
Важное различие между ними заключается в том, что:
84
84
- `||` возвращает первое *истинное* значение.
85
85
- `??` возвращает первое *определённое* значение.
86
86
87
-
Проще говоря, оператор `||` не различает `false`, `0`, пустую строку `""` и `null/undefined`. Для него они все одинаковые, т.е. являются ложными значениями. Если первым аргументом для оператора `||` будет любое из перечисленных значений, то в качестве результата мы получим второй аргумент.
87
+
Проще говоря, оператор `||` не различает `false`, `0`, пустую строку `""` и `null/undefined`. Для него они все одинаковы, т.е. являются ложными значениями. Если первым аргументом для оператора `||` будет любое из перечисленных значений, то в качестве результата мы получим второй аргумент.
88
88
89
89
Однако на практике часто требуется использовать значение по умолчанию только тогда, когда переменная является `null/undefined`. Ведь именно тогда значение действительно неизвестно/не определено.
90
90
91
-
Например, рассмотрим следующий пример:
91
+
Рассмотрим следующий пример:
92
92
93
93
```js run
94
94
let height =0;
@@ -97,20 +97,20 @@ alert(height || 100); // 100
97
97
alert(height ??100); // 0
98
98
```
99
99
100
-
- `height ||100` проверяет `height` на наличие ложного значения, оно равно `0`, так что это действительно false.
100
+
- `height ||100` проверяет `height` на ложное значение, оно равно `0`, да, ложное.
101
101
- поэтому результатом `||` является второй аргумент, т.е. `100`.
102
102
- `height ??100` проверяет, что переменная `height` содержит `null/undefined`, а поскольку это не так,
103
103
- то результатом является сама переменная `height`, т.е. `0`.
104
104
105
-
На практике нулевая высота часто является вполне возможным значением, которое не следует заменять значением по умолчанию. Таким образом, `??`делает все правильно.
105
+
На практике нулевая высота часто является вполне нормальным значением, которое не следует заменять значением по умолчанию. Таким образом, `??`здесь как раз работает так, как нужно.
106
106
107
107
## Приоритет
108
108
109
109
Приоритет оператора `??` такой же, как и у `||`. Они оба равны `4` в [таблице на MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table).
110
110
111
111
Это означает, что, как и `||`, оператор нулевого слияния `??` вычисляется до `=` и `?`, но после большинства других операций, таких как `+`, `*`.
112
112
113
-
Из этого следует, что если нужно выбрать значение при помощи оператора `??` вместе с другими операторами в выражении, следует добавить круглые скобки:
113
+
Так что, в выражениях такого вида понадобятся скобки:
114
114
115
115
```js run
116
116
let height =null;
@@ -122,29 +122,29 @@ let area = (height ?? 100) * (width ?? 50);
122
122
alert(area); // 5000
123
123
```
124
124
125
-
Иначе, если опустить скобки, то оператор `*` выполнится первым, так как у него приоритет выше, чем у `??`, а это приведёт к неправильным результатам.
125
+
Иначе, если опустить скобки, оператор `*` выполнится первым, так как у него приоритет выше, чем у `??`, и это приведёт к неправильным результатам.
126
126
127
127
```js
128
-
// без круглых скобок
128
+
// без скобок
129
129
let area = height ??100* width ??50;
130
130
131
-
// ...то же самое, что предыдущее выражение (вероятно, это не то, что нам нужно):
131
+
// ...сработает вот так (совсем не как нам нужно):
132
132
let area = height ?? (100* width) ??50;
133
133
```
134
134
135
135
### Использование ?? вместе с && или ||
136
136
137
-
По соображениям безопасности JavaScript запрещает использование оператора `??` вместе с `&&` и `||`, если только приоритет явно не указан в круглых скобках.
137
+
По соображениям безопасности JavaScript запрещает использование оператора `??` вместе с `&&` и `||`, если приоритет явно не указан при помощи круглых скобок.
138
138
139
139
Выполнение следующего кода приведёт к синтаксической ошибке:
140
140
141
141
```js run
142
142
let x =1&&2??3; // Синтаксическая ошибка
143
143
```
144
144
145
-
Ограничение безусловно спорное, оно было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переключаться с `||` на `??`.
145
+
Это, безусловно спорное, ограничение было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переходить с `||` на `??`.
146
146
147
-
Используйте круглые скобки, чтобы обойти это ограничение:
147
+
Используйте скобки, чтобы обойти это ограничение:
148
148
149
149
```js run
150
150
*!*
@@ -166,4 +166,4 @@ alert(x); // 2
166
166
```
167
167
168
168
- Оператор `??` имеет очень низкий приоритет, лишь немного выше, чем у `?` и `=`, поэтому при использовании его в выражении, скорее всего, потребуются скобки.
169
-
- Запрещено использовать вместе с `||` или `&&` без явно указанных круглых скобок.
169
+
- Запрещено использовать вместе с `||` или `&&` без явно указанного приоритета, то есть без скобок.
0 commit comments