Skip to content

Commit 6500334

Browse files
committed
minor fixes
1 parent bebad9a commit 6500334

File tree

1 file changed

+28
-28
lines changed
  • 1-js/02-first-steps/12-nullish-coalescing-operator

1 file changed

+28
-28
lines changed

1-js/02-first-steps/12-nullish-coalescing-operator/article.md

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,47 +4,47 @@
44

55
Оператор нулевого слияния представляет собой два вопросительных знака `??`.
66

7-
Так как он рассматривает `null` и `undefined` аналогично, мы введём специальный термин. Мы будем говорить, что выражение "определено", только если оно не равняется ни `null`, ни `undefined`.
7+
Так как он обрабатывает `null` и `undefined` одинаковым образом, то для этой статьи мы введём специальный термин. Для краткости будем говорить, что значение "определено", если оно не равняется ни `null`, ни `undefined`.
88

99
Результат выражения `a ?? b` будет следующим:
10-
- `a`, если значение `a` определено,
11-
- `b`, если значение `a` не определено.
10+
- если `a` определено, то `a`,
11+
- если `a` не определено, то `b`.
1212

13-
То есть оператор `??` возвращает первый аргумент, если он не `null/undefined`, иначе второй.
13+
Иначе говоря, оператор `??` возвращает первый аргумент, если он не `null/undefined`, иначе второй.
1414

15-
Оператор нулевого слияния не является чем-то принципиально новым. Это всего лишь удобный синтаксис, как из двух значений получить одно "определённое".
15+
Оператор нулевого слияния не является чем-то принципиально новым. Это всего лишь удобный синтаксис, как из двух значений получить одно, которое "определено".
1616

1717
Вот как можно переписать выражение `result = a ?? b`, используя уже знакомые нам операторы:
1818

1919
```js
2020
result = (a !== null && a !== undefined) ? a : b;
2121
```
2222

23-
Теперь должно быть абсолютно ясно, что `??` делает. Давайте посмотрим, где это может быть полезно.
23+
Теперь должно быть абсолютно ясно, что делает `??`. Давайте посмотрим, где это может быть полезно.
2424

25-
Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально неопределённой переменной.
25+
Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально не с переменной.
2626

27-
Например, здесь мы отобразим `user`, если он определен, в противном случае `Аноним`:
27+
Например, здесь мы отобразим `user`, если её значение не `null/undefined`, в противном случае `Аноним`:
2828

2929
```js run
3030
let user;
3131

32-
alert(user ?? "Аноним"); // Аноним (user не определен)
32+
alert(user ?? "Аноним"); // Аноним (user не существует)
3333
```
3434
35-
Вот пример `user`, с присвоенным именем:
35+
А вот пример, когда `user` присвоено значение:
3636
3737
```js run
3838
let user = "Иван";
3939

40-
alert(user ?? "Аноним"); // Иван (user определен)
40+
alert(user ?? "Аноним"); // Иван (user существует)
4141
```
4242
4343
Кроме этого, можно записать последовательность из операторов `??`, чтобы получить первое значение из списка, которое не является `null/undefined`.
4444
45-
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть не определены, если пользователь решил не вводить значение.
45+
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут не существовать, если пользователь решил не вводить соответствующие значение.
4646
47-
Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Анонимный", если все они не определены.
47+
Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Аноним", если все они `null/undefined`.
4848
4949
Для этого воспользуемся оператором `??`:
5050
@@ -53,7 +53,7 @@ let firstName = null;
5353
let lastName = null;
5454
let nickName = "Суперкодер";
5555

56-
// показывает первое определённое значение:
56+
// показывает первое значение, которое определено:
5757
*!*
5858
alert(firstName ?? lastName ?? nickName ?? "Аноним"); // Суперкодер
5959
*/!*
@@ -76,19 +76,19 @@ alert(firstName || lastName || nickName || "Аноним"); // Суперкод
7676
*/!*
7777
```
7878
79-
Исторически сложилось так, что оператор ИЛИ `||` появился первым. Он существует с самого начала существования JavaScript, поэтому разработчики долгое время использовали его для таких целей.
79+
Исторически сложилось так, что оператор ИЛИ `||` появился первым. Он существует с самого начала в JavaScript, поэтому разработчики долгое время использовали его для таких целей.
8080
81-
С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??` как раз потому, что многие были недовольны оператором `||`.
81+
С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??` - как раз потому, что многие были недовольны оператором `||`.
8282
8383
Важное различие между ними заключается в том, что:
8484
- `||` возвращает первое *истинное* значение.
8585
- `??` возвращает первое *определённое* значение.
8686
87-
Проще говоря, оператор `||` не различает `false`, `0`, пустую строку `""` и `null/undefined`. Для него они все одинаковые, т.е. являются ложными значениями. Если первым аргументом для оператора `||` будет любое из перечисленных значений, то в качестве результата мы получим второй аргумент.
87+
Проще говоря, оператор `||` не различает `false`, `0`, пустую строку `""` и `null/undefined`. Для него они все одинаковы, т.е. являются ложными значениями. Если первым аргументом для оператора `||` будет любое из перечисленных значений, то в качестве результата мы получим второй аргумент.
8888
8989
Однако на практике часто требуется использовать значение по умолчанию только тогда, когда переменная является `null/undefined`. Ведь именно тогда значение действительно неизвестно/не определено.
9090
91-
Например, рассмотрим следующий пример:
91+
Рассмотрим следующий пример:
9292
9393
```js run
9494
let height = 0;
@@ -97,20 +97,20 @@ alert(height || 100); // 100
9797
alert(height ?? 100); // 0
9898
```
9999
100-
- `height || 100` проверяет `height` на наличие ложного значения, оно равно `0`, так что это действительно false.
100+
- `height || 100` проверяет `height` на ложное значение, оно равно `0`, да, ложное.
101101
- поэтому результатом `||` является второй аргумент, т.е. `100`.
102102
- `height ?? 100` проверяет, что переменная `height` содержит `null/undefined`, а поскольку это не так,
103103
- то результатом является сама переменная `height`, т.е. `0`.
104104
105-
На практике нулевая высота часто является вполне возможным значением, которое не следует заменять значением по умолчанию. Таким образом, `??` делает все правильно.
105+
На практике нулевая высота часто является вполне нормальным значением, которое не следует заменять значением по умолчанию. Таким образом, `??` здесь как раз работает так, как нужно.
106106
107107
## Приоритет
108108
109109
Приоритет оператора `??` такой же, как и у `||`. Они оба равны `4` в [таблице на MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table).
110110
111111
Это означает, что, как и `||`, оператор нулевого слияния `??` вычисляется до `=` и `?`, но после большинства других операций, таких как `+`, `*`.
112112
113-
Из этого следует, что если нужно выбрать значение при помощи оператора `??` вместе с другими операторами в выражении, следует добавить круглые скобки:
113+
Так что, в выражениях такого вида понадобятся скобки:
114114
115115
```js run
116116
let height = null;
@@ -122,29 +122,29 @@ let area = (height ?? 100) * (width ?? 50);
122122
alert(area); // 5000
123123
```
124124
125-
Иначе, если опустить скобки, то оператор `*` выполнится первым, так как у него приоритет выше, чем у `??`, а это приведёт к неправильным результатам.
125+
Иначе, если опустить скобки, оператор `*` выполнится первым, так как у него приоритет выше, чем у `??`, и это приведёт к неправильным результатам.
126126
127127
```js
128-
// без круглых скобок
128+
// без скобок
129129
let area = height ?? 100 * width ?? 50;
130130

131-
// ...то же самое, что предыдущее выражение (вероятно, это не то, что нам нужно):
131+
// ...сработает вот так (совсем не как нам нужно):
132132
let area = height ?? (100 * width) ?? 50;
133133
```
134134
135135
### Использование ?? вместе с && или ||
136136
137-
По соображениям безопасности JavaScript запрещает использование оператора `??` вместе с `&&` и `||`, если только приоритет явно не указан в круглых скобках.
137+
По соображениям безопасности JavaScript запрещает использование оператора `??` вместе с `&&` и `||`, если приоритет явно не указан при помощи круглых скобок.
138138
139139
Выполнение следующего кода приведёт к синтаксической ошибке:
140140
141141
```js run
142142
let x = 1 && 2 ?? 3; // Синтаксическая ошибка
143143
```
144144
145-
Ограничение безусловно спорное, оно было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переключаться с `||` на `??`.
145+
Это, безусловно спорное, ограничение было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переходить с `||` на `??`.
146146
147-
Используйте круглые скобки, чтобы обойти это ограничение:
147+
Используйте скобки, чтобы обойти это ограничение:
148148
149149
```js run
150150
*!*
@@ -166,4 +166,4 @@ alert(x); // 2
166166
```
167167
168168
- Оператор `??` имеет очень низкий приоритет, лишь немного выше, чем у `?` и `=`, поэтому при использовании его в выражении, скорее всего, потребуются скобки.
169-
- Запрещено использовать вместе с `||` или `&&` без явно указанных круглых скобок.
169+
- Запрещено использовать вместе с `||` или `&&` без явно указанного приоритета, то есть без скобок.

0 commit comments

Comments
 (0)