Skip to content

Commit c5c726d

Browse files
authored
Made the required changes
1 parent 5daf338 commit c5c726d

File tree

1 file changed

+15
-15
lines changed
  • 1-js/04-object-basics/07-optional-chaining

1 file changed

+15
-15
lines changed

1-js/04-object-basics/07-optional-chaining/article.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ alert(user.address.street); // Ошибка!
2828
...и ещё один пример. В веб-разработке мы можем получить объект, соответствующий элементу веб-страницы, с помощью специального вызова метода, такого как `document.querySelector('.elem')`, и он возвращает `null`, когда такого элемента нет.
2929

3030
```js run
31-
// document.querySelector('.elem') равен нулю, если элемента нет
32-
let html = document.querySelector('.elem').innerHTML; // ошибка, если он равен нулю
31+
// document.querySelector('.elem') равен null, если элемента нет
32+
let html = document.querySelector('.elem').innerHTML; // ошибка, если он равен null
3333
```
3434

3535
Ещё раз, если элемент не существует, мы получим сообщение об ошибке доступа к `.innerHTML` со значением `null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата.
@@ -58,7 +58,7 @@ alert(user.address ? user.address.street ? user.address.street.name : null : nul
5858

5959
Это просто ужасно, у кого-то могут даже возникнуть проблемы с пониманием такого кода.
6060

61-
Даже не беспокойтесь об этом, так как есть лучший способ написать это, используя оператор `&&`:
61+
Вообще не стоит волноваться, так как есть лучший способ написать это, используя оператор `&&`:
6262

6363
```js run
6464
let user = {}; // пользователь без адреса
@@ -74,7 +74,7 @@ alert( user.address && user.address.street && user.address.street.name ); // und
7474

7575
## Опциональная цепочка
7676

77-
Опциональная цепочка `?.` останавливает вычисление и возвращает `undefined`, если значение перед `?.` имеет значение `undefined` или `null`.
77+
Опциональная цепочка `?.` останавливает вычисление и возвращает `undefined`, если значение перед `?.` равно `undefined` или `null`.
7878

7979
**Далее в этой статье, для краткости, мы будем говорить, что что-то "существует", если оно не является `null` и не `undefined`.**
8080

@@ -106,11 +106,11 @@ alert( user?.address.street ); // undefined
106106
Так например, в `user?.address.street.name` `?.` позволяет `user` безопасно быть `null/undefined` (и в этом случае возвращает `undefined`), но это только для `user`. Доступ к последующим свойствам осуществляется обычным способом. Если мы хотим, чтобы некоторые из них были необязательными, тогда нам нужно будет заменить больше `.` на `?.`.
107107
108108
```warn header="Не злоупотребляйте опциональной цепочкой"
109-
Мы должны использовать `?.` только там, где это нормально, что чего-то не существует.
109+
Нам следует использовать `?.` только там, где это нормально, что чего-то не существует.
110110

111-
К примеру, если в соответствии с нашей логикой кодирования объект `user` должен существовать, но `address` является необязательным, то нам следует написать `user.address?.street`, но не `user?.address?.street`.
111+
К примеру, если в соответствии с нашей логикой кода объект `user` должен существовать, но `address` является необязательным, то нам следует писать `user.address?.street`, но не `user?.address?.street`.
112112

113-
Таким образом, если `user` окажется неопределённым из-за погрешности, мы увидим программную ошибку по этому поводу и исправим её. В противном случае ошибки кодирования могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать.
113+
В этом случае, если вдруг `user` окажется `undefined`, мы увидим программную ошибку по этому поводу и исправим её. В противном случае, если слишком часто использовать `?.`, ошибки могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать.
114114
```
115115
116116
````warn header="Переменная перед `?.` должна быть объявлена"
@@ -120,22 +120,22 @@ alert( user?.address.street ); // undefined
120120
// ReferenceError: user is not defined
121121
user?.address;
122122
```
123-
Переменная должна быть объявлена (к примеру как, `let/const/var user` или как параметр функции). Опциональная цепочка работает только с объявленными переменными.
123+
Переменная должна быть объявлена (к примеру, как `let/const/var user` или как параметр функции). Опциональная цепочка работает только с объявленными переменными.
124124
````
125125

126-
## Короткое замыкание
126+
## Вычисления по короткой схеме
127127

128-
Как было сказано ранее, `?.` немедленно останавливает ("закорачиваетамыкает") вычисление, если левая часть не существует.
128+
Как было сказано ранее, `?.` немедленно останавливает вычисление, если левая часть не существует.
129129

130-
Таким образом, если есть какие-либо последующие вызовы функций или побочные явления, они не совершаться.
130+
Так что если после `?.` есть какие-то вызовы функций или операции, то они не произойдут.
131131

132132
Например:
133133

134134
```js run
135135
let user = null;
136136
let x = 0;
137137
138-
user?.sayHi(x++); // нет "sayHi", поэтому выполнение не достигает x++
138+
user?.sayHi(x++); // нет "user", поэтому выполнение не достигает вызова sayHi и x++
139139
140140
alert(x); // 0, значение не увеличилось
141141
```
@@ -202,7 +202,7 @@ user?.name = "John"; // Error, не работает
202202
// потому что он вычисляется как undefined = "John"
203203
```
204204

205-
Она недостаточно умна для этого.
205+
Она недостаточно "умна" для этого.
206206
````
207207

208208
## Итого
@@ -211,10 +211,10 @@ user?.name = "John"; // Error, не работает
211211

212212
1. `obj?.prop` -- возвращает `obj.prop` если `obj` существует, в противном случае `undefined`.
213213
2. `obj?.[prop]` -- возвращает `obj[prop]` если `obj` существует, в противном случае `undefined`.
214-
3. `obj.метод?.()` -- вызывает `obj.method()`, если `obj.method` существует, в противном случае возвращает `undefined`.
214+
3. `obj.method?.()` -- вызывает `obj.method()`, если `obj.method` существует, в противном случае возвращает `undefined`.
215215

216216
Как мы видим, все они просты и понятны в использовании. `?.` проверяет левую часть на `null/undefined` и позволяет продолжить вычисление, если это не так.
217217

218218
Цепочка `?.` позволяет безопасно получать доступ к вложенным свойствам.
219219

220-
Тем не менее, мы должны использовать `?.` осторожно, только там, где это допустимо, что левая часть не существует. И чтобы он не скрывал от нас ошибки программирования, если они возникнут.
220+
Тем не менее, мы должны использовать `?.` осторожно, только там, где допустимо, что левая часть не существует. И чтобы он не скрывал от нас ошибки программирования, если они возникнут.

0 commit comments

Comments
 (0)