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
Copy file name to clipboardExpand all lines: 1-js/99-js-misc/07-weakref-finalizationregistry/article.md
+14-14Lines changed: 14 additions & 14 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -22,6 +22,9 @@ user = null;
22
22
23
23
// посилання втрачається і об'єкт буде видалено з пам'яті
24
24
25
+
```
26
+
27
+
Або схожий, але трохи складніший код із двома сильними посиланнями:
25
28
26
29
```js
27
30
// у змінній user знаходиться сильне посилання на об'єкт
@@ -39,31 +42,30 @@ user = null;
39
42
```
40
43
Об'єкт `{ name: "John" }` видалиться з пам'яті тільки в разі відсутності сильних посилань на нього (якби ми також перепризначили значення змінної `admin`).
41
44
42
-
У JavaScript існує концепція під назвою `WeakRef`, яка поводиться трохи інакше в цьому випадку.
45
+
У JavaScript існує концепція під назвою `WeakRef`, яка працює трохи інакше в цьому випадку.
**Сильне посилання**- це посилання на об'єкт або значення, яке запобігає їх видаленню збирачем сміття.
46
-
При цьому, зберігаючи об'єкт або значення в пам'яті, на які воно вказує.
48
+
**Сильне посилання** - це посилання на об'єкт або значення, яке запобігає їх видаленню збирачем сміття. При цьому, зберігаючи об'єкт або значення в пам'яті, на які воно вказує.
47
49
48
50
Це означає, що об'єкт або значення залишаються в пам'яті й не видаляються збирачем сміття доти, доки на них є активні сильні посилання.
49
51
50
52
У JavaScript стандартні посилання на об'єкти є *сильними* посиланнями. Наприклад:
53
+
51
54
```js
52
55
// змінна user містить сильне посилання на цей об'єкт
53
56
let user = { name: "John" };
54
57
```
55
-
56
58
**Слабке посилання** - це посилання на об'єкт або значення, яке *не* запобігає їх видаленню збирачем сміття. Об'єкт або значення можуть бути видалені збирачем сміття у випадку, якщо на них існують тільки слабкі посилання.
57
59
````
58
60
59
61
## WeakRef
60
62
63
+
61
64
````warn header="Застереження"
62
-
Перш ніж ми перейдемо до вивчення, варто зазначити, що правильне застосування структур,
63
-
про які йтиметься в цій статті, вимагає дуже ретельного обмірковування, і якщо це можливо, їхнього використання краще уникати.
65
+
Перш ніж ми перейдемо до вивчення, варто зазначити, що правильне застосування структур з цієї статті, вимагає дуже ретельного обмірковування, і якщо це можливо, їхнього використання краще уникати.
64
66
````
65
67
66
-
`WeakRef`- це об'єкт, що містить слабке посилання на інший об'єкт, який називається `target` або `referent`.
68
+
`WeakRef` - це об'єкт, що містить слабке посилання на інший об'єкт, який називається `target` або `referent`.
67
69
68
70
Особливість `WeakRef` полягає в тому, що він не перешкоджає збирачеві сміття видаляти свій об'єкт-референт. Іншими словами, він просто не утримує його "в живих".
69
71
@@ -82,7 +84,7 @@ let admin = new WeakRef(user);
82
84
*/!*
83
85
```
84
86
85
-
На схемі нижче зображено два типи посилань: сильне посилання з використанням змінної `user` і слабке посилання з використанням змінної `admin`:
87
+
На схемі нижче зображено два типи посилань: сильне посилання з використанням змінної `user` і слабке посилання з використанням змінної `admin`:
86
88
87
89

88
90
@@ -94,17 +96,15 @@ user = null;
94
96
```
95
97
96
98
Слабкого посилання на об'єкт недостатньо, щоб зберегти його "в живих".
97
-
Коли єдиними зоставшимися посиланнями на об'єкт-референт, є слабкі посилання, збирач сміття має право знищити цей об'єкт і використовувати його пам'ять для чогось іншого.
98
99
99
100
Однак доти, доки об'єкт фактично не знищено, слабке посилання може повернути його, навіть якщо на цей об'єкт більше немає сильних посилань.
100
-
Тобто наш об'єкт стає своєрідним "[котом Шредінгера](https://uk.wikipedia.org/wiki/%D0%9A%D1%96%D1%82_%D0%A8%D1%80%D0%B5%D0%B4%D1%96%D0%BD%D0%B3%D0%B5%D1%80%D0%B0)" - ми не можемо знати точно, "живий" він чи "мертвий":
101
+
Тобто наш об'єкт стає своєрідним "[котом Шредінгера](https://uk.wikipedia.org/wiki/Кіт_Шредінгера)" - ми не можемо знати точно, "живий" він чи "мертвий":
101
102
102
103

103
104
104
-
На цьому етапі, щоб отримати об'єкт із екземпляра`WeakRef`, ми скористаємося його методом `deref()`.
105
+
На цьому етапі, щоб отримати об'єкт з екземпляру`WeakRef`, ми використаємо його `deref()` метод.
105
106
106
-
Метод `deref()` повертає об'єкт-референт, на який посилається `WeakRef`, якщо об'єкт все ще перебуває в пам'яті.
107
-
Якщо об'єкт було видалено збирачем сміття, - метод `deref()` поверне `undefined`:
107
+
Метод `deref()` повертає об'єкт-референт, на який посилається `WeakRef`, якщо об'єкт все ще перебуває в пам'яті. Якщо об'єкт було видалено збирачем сміття, - метод `deref()` поверне `undefined`:
108
108
109
109
```js
110
110
let ref =admin.deref();
@@ -118,7 +118,7 @@ if (ref) {
118
118
119
119
## Варіанти використання WeakRef
120
120
121
-
`WeakRef` зазвичай використовується для створення кешів або
121
+
`WeakRef` зазвичай використовується для створення кешу або[асоціативних масивів](https://uk.wikipedia.org/wiki/Асоціативний_масив), де зберігаються великі об'єкти.
122
122
[асоціативних масивів](https://uk.wikipedia.org/wiki/%D0%90%D1%81%D0%BE%D1%86%D1%96%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B8%D0%B9_%D0%BC%D0%B0%D1%81%D0%B8%D0%B2), де зберігаються ресурсомісткі об'єкти.
123
123
Це дозволяє уникнути перешкоджанню видаленню цих об'єктів збирачем сміття тільки на основі їхньої присутності в кеші або асоціативному масиві.
0 commit comments