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
...и ещё один пример. В веб-разработке мы можем получить объект, соответствующий элементу веб-страницы, с помощью специального вызова метода, такого как `document.querySelector('.elem')`, и он возвращает `null`, когда такого элемента нет.
29
29
30
30
```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
33
33
```
34
34
35
35
Ещё раз, если элемент не существует, мы получим сообщение об ошибке доступа к `.innerHTML` со значением `null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата.
Так например, в `user?.address.street.name``?.` позволяет `user` безопасно быть `null/undefined` (и в этом случае возвращает `undefined`), но это только для `user`. Доступ к последующим свойствам осуществляется обычным способом. Если мы хотим, чтобы некоторые из них были необязательными, тогда нам нужно будет заменить больше `.` на `?.`.
Мы должны использовать `?.` только там, где это нормально, что чего-то не существует.
109
+
Нам следует использовать `?.` только там, где это нормально, что чего-то не существует.
110
110
111
-
К примеру, если в соответствии с нашей логикой кодирования объект `user` должен существовать, но `address` является необязательным, то нам следует написать`user.address?.street`, но не `user?.address?.street`.
111
+
К примеру, если в соответствии с нашей логикой кода объект `user` должен существовать, но `address` является необязательным, то нам следует писать`user.address?.street`, но не `user?.address?.street`.
112
112
113
-
Таким образом, если `user` окажется неопределённым из-за погрешности, мы увидим программную ошибку по этому поводу и исправим её. В противном случае ошибки кодирования могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать.
113
+
В этом случае, если вдруг `user` окажется `undefined`, мы увидим программную ошибку по этому поводу и исправим её. В противном случае, если слишком часто использовать `?.`, ошибки могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать.
114
114
```
115
115
116
116
````warn header="Переменная перед `?.` должна быть объявлена"
Переменная должна быть объявлена (к примеру как,`let/const/varuser` или как параметр функции). Опциональная цепочка работает только с объявленными переменными.
123
+
Переменная должна быть объявлена (к примеру, как `let/const/varuser` или как параметр функции). Опциональная цепочка работает только с объявленными переменными.
124
124
````
125
125
126
-
## Короткое замыкание
126
+
## Вычисления по короткой схеме
127
127
128
-
Как было сказано ранее, `?.` немедленно останавливает ("закорачивает\замыкает") вычисление, если левая часть не существует.
128
+
Как было сказано ранее, `?.` немедленно останавливает вычисление, если левая часть не существует.
129
129
130
-
Таким образом, если есть какие-либо последующие вызовы функций или побочные явления, они не совершаться.
130
+
Так что если после `?.`есть какие-то вызовы функций или операции, то они не произойдут.
131
131
132
132
Например:
133
133
134
134
```js run
135
135
let user = null;
136
136
let x = 0;
137
137
138
-
user?.sayHi(x++); // нет "sayHi", поэтому выполнение не достигает x++
138
+
user?.sayHi(x++); // нет "user", поэтому выполнение не достигает вызова sayHi и x++
139
139
140
140
alert(x); // 0, значение не увеличилось
141
141
```
@@ -202,7 +202,7 @@ user?.name = "John"; // Error, не работает
202
202
// потому что он вычисляется как undefined = "John"
203
203
```
204
204
205
-
Она недостаточно умна для этого.
205
+
Она недостаточно "умна" для этого.
206
206
````
207
207
208
208
## Итого
@@ -211,10 +211,10 @@ user?.name = "John"; // Error, не работает
211
211
212
212
1.`obj?.prop`-- возвращает `obj.prop` если `obj` существует, в противном случае `undefined`.
213
213
2.`obj?.[prop]`-- возвращает `obj[prop]` если `obj` существует, в противном случае `undefined`.
214
-
3.`obj.метод?.()`-- вызывает `obj.method()`, если `obj.method` существует, в противном случае возвращает `undefined`.
214
+
3.`obj.method?.()`-- вызывает `obj.method()`, если `obj.method` существует, в противном случае возвращает `undefined`.
215
215
216
216
Как мы видим, все они просты и понятны в использовании. `?.` проверяет левую часть на `null/undefined` и позволяет продолжить вычисление, если это не так.
217
217
218
218
Цепочка `?.` позволяет безопасно получать доступ к вложенным свойствам.
219
219
220
-
Тем не менее, мы должны использовать `?.` осторожно, только там, где это допустимо, что левая часть не существует. И чтобы он не скрывал от нас ошибки программирования, если они возникнут.
220
+
Тем не менее, мы должны использовать `?.` осторожно, только там, где допустимо, что левая часть не существует. И чтобы он не скрывал от нас ошибки программирования, если они возникнут.
0 commit comments