Skip to content

Commit bebad9a

Browse files
authored
Merge pull request #1554 from Rnbsov/patch-37
Добавил недостающую информацию
2 parents 869d094 + c32feab commit bebad9a

File tree

4 files changed

+19
-18
lines changed

4 files changed

+19
-18
lines changed

1-js/02-first-steps/08-operators/3-primitive-conversions-questions/solution.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ true + false = 1
99
"$" + 4 + 5 = "$45"
1010
"4" - 2 = 2
1111
"4px" - 2 = NaN
12-
7 / 0 = Infinity
1312
" -9 " + 5 = " -9 5" // (3)
1413
" -9 " - 5 = -14 // (4)
1514
null + 1 = 1 // (5)

1-js/02-first-steps/08-operators/3-primitive-conversions-questions/task.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ true + false
1616
"$" + 4 + 5
1717
"4" - 2
1818
"4px" - 2
19-
7 / 0
2019
" -9 " + 5
2120
" -9 " - 5
2221
null + 1

1-js/02-first-steps/11-logical-operators/article.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Логические операторы
22

3-
В JavaScript есть три логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ).
3+
В JavaScript есть четыре логических оператора: `||` (ИЛИ), `&&` (И) и `!` (НЕ), `??` (Оператор нулевого слияния). Здесь мы рассмотрим первые три, оператор `??` будет в следующей статье.
44

55
Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип.
66

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

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
[recent browser="new"]
44

5-
В этой статье мы будем говорить, что значение выражения "определено", если оно отличается от `null` или `undefined`.
6-
75
Оператор нулевого слияния представляет собой два вопросительных знака `??`.
86

7+
Так как он рассматривает `null` и `undefined` аналогично, мы введём специальный термин. Мы будем говорить, что выражение "определено", только если оно не равняется ни `null`, ни `undefined`.
8+
99
Результат выражения `a ?? b` будет следующим:
1010
- `a`, если значение `a` определено,
1111
- `b`, если значение `a` не определено.
@@ -20,29 +20,31 @@
2020
result = (a !== null && a !== undefined) ? a : b;
2121
```
2222

23+
Теперь должно быть абсолютно ясно, что `??` делает. Давайте посмотрим, где это может быть полезно.
24+
2325
Как правило, оператор `??` нужен для того, чтобы задать значение по умолчанию для потенциально неопределённой переменной.
2426

25-
Например, в следующем примере, если переменная `user` не определена, покажем модальное окно с надписью `Аноним`:
27+
Например, здесь мы отобразим `user`, если он определен, в противном случае `Аноним`:
2628

2729
```js run
2830
let user;
2931

30-
alert(user ?? "Аноним"); // Аноним
32+
alert(user ?? "Аноним"); // Аноним (user не определен)
3133
```
3234
33-
Конечно, если бы переменная `user` содержала любое значение, кроме `null/undefined`, то мы бы увидели его:
35+
Вот пример `user`, с присвоенным именем:
3436
3537
```js run
3638
let user = "Иван";
3739

38-
alert(user ?? "Аноним"); // Иван
40+
alert(user ?? "Аноним"); // Иван (user определен)
3941
```
4042
4143
Кроме этого, можно записать последовательность из операторов `??`, чтобы получить первое значение из списка, которое не является `null/undefined`.
4244
43-
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть неопределёнными, если отсутствует соответствующая информация.
45+
Допустим, у нас есть данные пользователя в переменных `firstName`, `lastName` или `nickName`. Все они могут быть не определены, если пользователь решил не вводить значение.
4446
45-
Выведем имя пользователя, используя одну из этих переменных, а в случае если все они не определены, то покажем "Аноним".
47+
Мы хотели бы отобразить имя пользователя, используя одну из этих переменных, или показать "Анонимный", если все они не определены.
4648
4749
Для этого воспользуемся оператором `??`:
4850
@@ -74,7 +76,7 @@ alert(firstName || lastName || nickName || "Аноним"); // Суперкод
7476
*/!*
7577
```
7678
77-
Оператор ИЛИ `||` существует с самого появления JavaScript, поэтому ранее для решения похожих задач разработчики использовали именно его.
79+
Исторически сложилось так, что оператор ИЛИ `||` появился первым. Он существует с самого начала существования JavaScript, поэтому разработчики долгое время использовали его для таких целей.
7880
7981
С другой стороны, сравнительно недавно в язык был добавлен оператор нулевого слияния `??` как раз потому, что многие были недовольны оператором `||`.
8082
@@ -95,17 +97,18 @@ alert(height || 100); // 100
9597
alert(height ?? 100); // 0
9698
```
9799
98-
- `height || 100` проверяет, имеет ли переменная `height` ложное значение, что так и есть,
99-
- поэтому результатом является второй аргумент, т.е. `100`.
100+
- `height || 100` проверяет `height` на наличие ложного значения, оно равно `0`, так что это действительно false.
101+
- поэтому результатом `||` является второй аргумент, т.е. `100`.
100102
- `height ?? 100` проверяет, что переменная `height` содержит `null/undefined`, а поскольку это не так,
101103
- то результатом является сама переменная `height`, т.е. `0`.
102104
103-
Если нулевая высота является "нормальным" значением, которое не должно заменяться значением по умолчанию, то оператор `??` делает как раз то, что нужно.
105+
На практике нулевая высота часто является вполне возможным значением, которое не следует заменять значением по умолчанию. Таким образом, `??` делает все правильно.
104106
105107
## Приоритет
106108
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+
Это означает, что, как и `||`, оператор нулевого слияния `??` вычисляется до `=` и `?`, но после большинства других операций, таких как `+`, `*`.
109112
110113
Из этого следует, что если нужно выбрать значение при помощи оператора `??` вместе с другими операторами в выражении, следует добавить круглые скобки:
111114
@@ -139,7 +142,7 @@ let area = height ?? (100 * width) ?? 50;
139142
let x = 1 && 2 ?? 3; // Синтаксическая ошибка
140143
```
141144
142-
Это довольно спорное ограничение, которое было описано в спецификации языка, чтобы избежать ошибок при замене оператора `||` на `??`.
145+
Ограничение безусловно спорное, оно было добавлено в спецификацию языка с целью избежать программные ошибки, когда люди начнут переключаться с `||` на `??`.
143146
144147
Используйте круглые скобки, чтобы обойти это ограничение:
145148

0 commit comments

Comments
 (0)