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
let html =document.querySelector('.elem').innerHTML; // ошибка, если он равен null
33
33
```
34
34
35
-
Ещё раз, если элемент не существует, мы получим сообщение об ошибке доступа к `.innerHTML`со значением`null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата.
35
+
Ещё раз, если элемент не существует, мы получим сообщение об ошибке доступа к свойству `.innerHTML`у`null`. И в некоторых случаях, когда отсутствие элемента является нормальным, мы хотели бы избежать ошибки и просто принять `html = null` в качестве результата.
Это работает, тут нет ошибки... Но это довольно неэлегантно. Как вы можете видеть, `"user.address"` появляется в коде дважды. Для более глубоко вложенных свойств это становится проблемой, поскольку потребуется больше повторений.
47
+
Это работает, тут нет ошибки... Но это довольно неэлегантно. Как вы можете видеть, `"user.address"` появляется в коде дважды.
48
48
49
-
К примеру, давайте попробуем получить `user.address.street.name`.
49
+
Вот как то же самое выглядело бы для `document.querySelector`:
50
+
51
+
```js run
52
+
let html =document.querySelector('.elem') ?document.querySelector('.elem').innerHTML:null;
53
+
```
54
+
55
+
Как видно, поиск элемента `document.querySelector('.elem')` здесь вызывается дважды, что не очень хорошо.
56
+
57
+
Для более глубоко вложенных свойств это ещё менее красиво, поскольку потребуется больше повторений.
58
+
59
+
К примеру, давайте аналогично вычислим `user.address.street.name`.
50
60
51
61
Нам нужно проверить как `user.address`, так и `user.address.street`:
Обратите внимание: синтаксис `?.` делает необязательным значение перед ним, но не какое-либо последующее.
105
121
106
-
Так например, в `user?.address.street.name``?.` позволяет `user` безопасно быть `null/undefined` (и в этом случае возвращает `undefined`), но это только для `user`. Доступ к последующим свойствам осуществляется обычным способом. Если мы хотим, чтобы некоторые из них были необязательными, тогда нам нужно будет заменить больше `.` на `?.`.
122
+
Так например, в записи `user?.address.street.name``?.` позволяет `user` безопасно быть `null/undefined` (и в этом случае возвращает `undefined`), но это так только для `user`. Доступ к последующим свойствам осуществляется обычным способом. Если мы хотим, чтобы некоторые из них были необязательными, тогда нам нужно будет заменить больше `.` на `?.`.
Нам следует использовать `?.` только там, где нормально, что чего-то не существует.
110
126
111
-
К примеру, если, в соответствии с нашей логикой кода, объект `user` должен существовать, но `address` является необязательным, то нам следует писать `user.address?.street`, но не `user?.address?.street`.
127
+
К примеру, если, в соответствии с логикой нашего кода, объект `user` должен существовать, но `address` является необязательным, то нам следует писать `user.address?.street`, но не `user?.address?.street`.
112
128
113
129
В этом случае, если вдруг `user` окажется `undefined`, мы увидим программную ошибку по этому поводу и исправим её. В противном случае, если слишком часто использовать `?.`, ошибки могут замалчиваться там, где это неуместно, и их будет сложнее отлаживать.
114
130
```
@@ -151,22 +167,22 @@ alert(x); // 0, значение не увеличилось
151
167
```js run
152
168
let userAdmin = {
153
169
admin() {
154
-
alert("I am admin");
170
+
alert("Я админ");
155
171
}
156
172
};
157
173
158
174
let userGuest = {};
159
175
160
176
*!*
161
-
userAdmin.admin?.(); // I am admin
177
+
userAdmin.admin?.(); // Я админ
162
178
*/!*
163
179
164
180
*!*
165
-
userGuest.admin?.(); // ничего (такого метода нет)
181
+
userGuest.admin?.(); // ничего не произойдет (такого метода нет)
166
182
*/!*
167
183
```
168
184
169
-
Здесь в обеих строках мы сначала используем точку (`userAdmin.admin`), чтобы получить свойство `admin`, потому что мы предполагаем, что объект user существует, так что читать из него безопасно.
185
+
Здесь в обеих строках мы сначала используем точку (`userAdmin.admin`), чтобы получить свойство `admin`, потому что мы предполагаем, что объект `user` существует, так что читать из него безопасно.
170
186
171
187
Затем `?.()` проверяет левую часть: если функция `admin` существует, то она запускается (это так для `userAdmin`). В противном случае (для `userGuest`) вычисление остановится без ошибок.
@@ -217,4 +232,4 @@ user?.name = "John"; // Ошибка, не работает
217
232
218
233
Цепочка `?.` позволяет безопасно получать доступ к вложенным свойствам.
219
234
220
-
Тем не менее, мы должны использовать `?.` осторожно, только там, где допустимо, что левая часть не существует. И чтобы он не скрывал от нас ошибки программирования, если они возникнут.
235
+
Тем не менее, мы должны использовать `?.` осторожно, только там, где по логике кода допустимо, что левая часть не существует. Чтобы он не скрывал от нас ошибки программирования, если они возникнут.
0 commit comments