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
І якщо відвідувач введе слово `"apple"`, то в об’єкті `bag` тепер буде лежати властивість `{apple: 5}`.
183
183
184
-
По суті, це працює так само, як:
184
+
По суті, це працює так само як:
185
185
```js run
186
186
let fruit =prompt("Які фрукти купити?", "apple");
187
187
let bag = {};
@@ -192,7 +192,7 @@ bag[fruit] = 5;
192
192
193
193
... Але виглядає приємніше.
194
194
195
-
Ми можемо використати більш складні вирази в квадратних дужках:
195
+
Ми можемо використати складніші вирази у квадратних дужках:
196
196
197
197
```js
198
198
let fruit ='apple';
@@ -205,7 +205,7 @@ let bag = {
205
205
206
206
Тому більшість часу, коли назви властивостей відомі та прості, використовується крапка. А якщо нам потрібно щось складніше, то переходимо до квадратних дужок.
207
207
208
-
## Властивість з змінної
208
+
## Властивість зі змінної
209
209
210
210
У реальному коді ми часто використовуємо наявні змінні як значення для імен властивостей.
211
211
@@ -224,7 +224,7 @@ let user = makeUser("Іван", 30);
224
224
alert(user.name); // Іван
225
225
```
226
226
227
-
В наведеному вище прикладі назва властивостей `name` і `age` збігаються з назвами змінних, які ми підставляємо в якості значень цих властивостей. Такий підхід настільки поширений, що існують спеціальні *короткі властивості* для спрощення цього запису.
227
+
В наведеному вище прикладі назва властивостей `name` і `age` збігаються з назвами змінних, які ми підставляємо як значення цих властивостей. Такий підхід настільки поширений, що існують спеціальні *короткі властивості* для спрощення цього запису.
228
228
229
229
Замість `name: name` ми можемо написати просто `name`:
230
230
@@ -452,7 +452,7 @@ for (let prop in user) {
452
452
}
453
453
```
454
454
455
-
Таким чином, щоб вирішити нашу проблему з телефонними кодами, ми можемо схитрувати, зробивши коди не цілочисельними властивостями. Додамо знак `"+"` перед кожним кодом.
455
+
Таким чином, щоб розв'язати нашу проблему з телефонними кодами, ми можемо схитрувати, зробивши коди не цілочисельними властивостями. Додамо знак `"+"` перед кожним кодом.
456
456
457
457
Приклад:
458
458
@@ -500,4 +500,4 @@ for (let code in codes) {
500
500
501
501
У них є свої особливості, які ми вивчимо пізніше. Іноді люди говорять щось на кшталт "тип даних Array" або "тип даних Date", але формально вони не є окремими типами, а належать до типу даних `"Object"`. Вони лише розширюють його різними способами.
502
502
503
-
Об’єкти в JavaScript дуже потужні. Тут ми тільки трохи заглибилися в дійсно величезну тему. Ми будемо тісно працювати з об’єктами і дізнаємося про них більше в наступних частинах підручника.
503
+
Об’єкти в JavaScript дуже потужні. Тут ми тільки трохи заглибилися в дійсно величезну тему. Ми будемо тісно працювати з об’єктами та дізнаємося про них більше в наступних частинах посібника.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/02-object-copy/article.md
+9-9Lines changed: 9 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@ let phrase = message;
17
17
18
18

19
19
20
-
Цілком очікуванний результат, згодні?
20
+
Цілком очікуваний результат, згодні?
21
21
22
22
Об’єкти поводяться інакше.
23
23
@@ -73,13 +73,13 @@ admin.name = 'Петро'; // змінено за посиланням зі зм
73
73
alert(*!*user.name*/!*); //'Петро', зміни видно з посилання зі змінної "user"
74
74
```
75
75
76
-
Уявіть, що об’єкт -- це шафа з якимись данними (властивостями). А "адреса" цієї шафи зберігається у двох шухлядах. Спочатку ми використовуємо одну з них (`admin`), щоб дістатися цієї шафи та щось змінити. Потім, якщо ми використаємо іншу шухляду (`user`), ми все ще відкриємо ту саму шафу і отримаємо доступ до зміненого вмісту.
76
+
Уявіть, що об’єкт -- це шафа з якимись даними (властивостями). А "адреса" цієї шафи зберігається у двох шухлядах. Спочатку ми використовуємо одну з них (`admin`), щоб дістатися цієї шафи та щось змінити. Потім, якщо ми використаємо іншу шухляду (`user`), ми все ще відкриваємо ту саму шафу й отримуємо доступ до зміненого вмісту.
77
77
78
78
## Порівняння за посиланням
79
79
80
80
Два об’єкти рівні, лише якщо це той самий об’єкт.
81
81
82
-
Наприклад, тут `a` і`b` посилаються на той самий об’єкт, отже, вони рівні:
82
+
Наприклад, тут `a` і`b` посилаються на один об’єкт, отже, вони рівні:
83
83
84
84
```js run
85
85
let a = {};
@@ -98,7 +98,7 @@ let b = {}; // два незалежні об’єкти
98
98
alert( a == b ); // false
99
99
```
100
100
101
-
Для порівнянь, таких як `obj1 > obj2`, або для порівняння з примітивом `obj ==5`, об’єкти перетворюються на примітиви. Незабаром ми вивчимо, як працюють перетворення об’єктів, але правду кажучи, такі порівняння потрібні вкрай рідко — зазвичай вони з’являються в результаті неправильного програмування.
101
+
Для порівнянь, таких як `obj1 > obj2`, або для порівняння з примітивом `obj ==5`, об’єкти перетворюються на примітиви. Незабаром ми вивчимо, як працюють перетворення об’єктів, але чесно кажучи, такі порівняння потрібні вкрай рідко -- зазвичай вони з’являються через помилки у коді.
102
102
103
103
````smart header="Об’єкти у const-змінних можна змінювати"
104
104
Важливим побічним ефектом зберігання об’єктів як посилань є те, що об’єкт, оголошений як `const`, *може* бути змінений.
@@ -121,7 +121,7 @@ alert(user.name); // Петро
121
121
122
122
Інакше кажучи, `const user` видає помилку, лише якщо ми намагаємося присвоїти у саму змінну інше значення:`user = ...`.
123
123
124
-
Тим не менш, якщо нам дійсно потрібно створювати незмінні властивості об’єкта, це також можливо, але з використанням зовсім інших методів. Про це ми згадаємо у розділі <info:property-descriptors>.
124
+
Проте, якщо нам дійсно потрібно створювати незмінні властивості об’єкта, це також можливо, але з використанням зовсім інших методів. Про це ми згадаємо у розділі <info:property-descriptors>.
125
125
````
126
126
127
127
## Клонування та злиття об’єктів, Object.assign [#cloning-and-merging-object-assign]
@@ -130,7 +130,7 @@ alert(user.name); // Петро
130
130
131
131
Але що, якщо нам потрібно створити копію, клон об'єкта?
132
132
133
-
Але якщо ми насправді цього хочемо, то нам потрібно створити новий об’єкт і відтворити структуру існуючого, перебираючи та копіюючи його властивості.
133
+
Але якщо ми насправді цього хочемо, то нам потрібно створити новий об’єкт і відтворити структуру чинного, перебираючи та копіюючи його властивості.
Ми також можемо використовувати `Object.assign` щоб виконати просте клонування об’єкта:
199
+
Ми також можемо використовувати `Object.assign`, щоб виконати просте клонування об’єкта:
200
200
201
201
```js run
202
202
let user = {
@@ -311,7 +311,7 @@ structuredClone({
311
311
312
312
Властивості з функціями не підтримуються.
313
313
314
-
Для обробки таких складних випадків нам може знадобитися використовувати комбінацію методів клонування, написати спеціальний код або, щоб не винаходити колесо, взяти існуючу реалізацію, наприклад [_.cloneDeep(obj)](https://lodash.com /docs#cloneDeep) із бібліотеки JavaScript [lodash](https://lodash.com).
314
+
Для обробки таких складних випадків нам може знадобитися використовувати комбінацію методів клонування, написати спеціальний код або, щоб не винаходити колесо, взяти чинну реалізацію, наприклад [_.cloneDeep(obj)](https://lodash.com /docs#cloneDeep) із бібліотеки JavaScript [lodash](https://lodash.com).
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/03-garbage-collection/article.md
+8-8Lines changed: 8 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,7 @@
10
10
11
11
Простіше кажучи, "досяжні" значення -- це ті, які якимось чином доступні або придатні для використання. Вони гарантовано зберігаються в пам’яті.
12
12
13
-
1. Існує базовий набір досяжних за своєю суттю значень, які неможливо видалити із зрозумілих причин.
13
+
1. Існує базовий набір досяжних за своєю суттю значень, які неможливо видалити зі зрозумілих причин.
14
14
15
15
Наприклад:
16
16
@@ -50,7 +50,7 @@ user = null;
50
50
51
51

52
52
53
-
Тепер Іван стає недосяжним. Немає доступу до нього, немає посилань на нього. Процес збирання сміття видалить дані і звільнить пам’ять.
53
+
Тепер Іван стає недосяжним. Немає доступу до нього, немає посилань на нього. Процес збирання сміття видалить дані та звільнить пам’ять.
54
54
55
55
## Два посилання
56
56
@@ -78,7 +78,7 @@ user = null;
78
78
79
79
## Взаємозв’язані об’єкти
80
80
81
-
Тепер більш складний приклад. Сім’я:
81
+
Тепер складніший приклад. Сім’я:
82
82
83
83
```js
84
84
functionmarry(man, woman) {
@@ -163,7 +163,7 @@ family = null;
163
163
164
164

165
165
166
-
З правого боку ми чітко бачимо "недосяжний острів". Тепер давайте подивимося, як збирання сміття "позначає і видаляє".
166
+
Праворуч ми чітко бачимо "недосяжний острів". Тепер подивімося, як збирання сміття "позначає і видаляє".
167
167
168
168
Перший крок позначає корені:
169
169
@@ -177,7 +177,7 @@ family = null;
177
177
178
178

179
179
180
-
Тепер об’єкти, які не вдалося відвідати в процесі, вважаються недосяжними і будуть видалені:
180
+
Тепер об’єкти, які не вдалося відвідати в процесі, вважаються недосяжними та будуть видалені:
181
181
182
182

183
183
@@ -189,9 +189,9 @@ family = null;
189
189
190
190
-**Збірка поколінь (Generational collection)** -- об’єкти поділяються на два набори: "нові" та "старі". Багато об'єктів мають короткий термін служби, вони з’являються, виконують свою роботу і швидко стають непотрібними. Тому має сенс відстежувати нові об’єкти та очищати від них пам’ять, якщо це так. Ті, що використовуються досить довго, стають "старими" і оглядаються рідше.
191
191
-**Інкрементний збір (Incremental collection)** -- якщо об’єктів багато, і ми намагаємось пройтися і позначити весь набір об’єктів одночасно, це може зайняти деякий час і ввести видимі затримки у виконанні. Тому рушій намагається розділити збирання сміття на частини. Потім частини виконуються по одній, окремо. Таким чином відбувається багато дрібних зборів сміття замість одного великого. Це вимагає додаткового обліку між ними для відстеження змін, але ми маємо багато маленьких затримок замість однієї великої.
192
-
-**Збір під час простою (Idle-time collection)** -- завзвичай збирання сміття працює лише під час простою процесора, щоб зменшити можливий вплив на виконання.
192
+
-**Збір під час простою (Idle-time collection)** -- зазвичай збирання сміття працює лише під час простою процесора, щоб зменшити можливий вплив на виконання.
193
193
194
-
Існують й інші оптимізації та варіанти алгоритмів збирання сміття. Але як би нам не хотілося описати їх тут, ми повинні утриматися від цього, тому що різні інтерпретатори JavaScript застосовують різні прийоми і хитрощі. І, що ще важливіше, все змінюється в міру розвитку інтерпретаторів, тому глибше вивчення "заздалегідь" без реальної потреби, ймовірно, не варто того. Якщо, звичайно, це не питання чистого інтересу, нижче для вас будуть деякі посилання.
194
+
Існують й інші оптимізації та варіанти алгоритмів збирання сміття. Але як би нам не хотілося описати їх тут, ми повинні утриматися від цього, тому що різні інтерпретатори JavaScript застосовують різні прийоми та хитрощі. І, що ще важливіше, все змінюється в міру розвитку інтерпретаторів, тому глибше вивчення "заздалегідь" без реальної потреби, ймовірно, не варто того. Якщо, звичайно, це не питання чистого інтересу, нижче для вас будуть деякі посилання.
195
195
196
196
## Підсумки
197
197
@@ -207,6 +207,6 @@ family = null;
207
207
208
208
Якщо ви знайомі з низькорівневим програмуванням, більш детальна інформація про збирання сміття у рушії V8 міститься у статті [A tour of V8: Garbage Collection](http://jayconrod.com/posts/55/a-tour-of-v8-garbage-collection).
209
209
210
-
[V8 blog](https://v8.dev/) також час від часу публікує статті про зміни в управлінні пам’яттю. Зрозуміло, вам необхідно розуміти, як влаштований всередині рущія V8 в цілому. Про це ви можете прочитати у блозі [Вячеслава Єгорова](https://mrale.ph) який працював одним з інженерів V8. Я кажу: "V8", тому що він найкраще висвітлений статтями в Інтернеті. Для інших інтерпретаторів деякі підходи схожі, але збирання сміття відрізняється в багатьох аспектах.
210
+
[V8 blog](https://v8.dev/) також час від часу публікує статті про зміни в управлінні пам’яттю. Зрозуміло, вам необхідно розуміти, як влаштований всередині рушія V8 в цілому. Про це ви можете прочитати у блозі [Вячеслава Єгорова](https://mrale.ph) який працював одним з інженерів V8. Я кажу: "V8", тому що він найкраще висвітлений статтями в Інтернеті. Для інших інтерпретаторів деякі підходи схожі, але збирання сміття відрізняється в багатьох аспектах.
211
211
212
212
Глибоке розуміння роботи інтерпретаторів необхідно, коли вам потрібні низькорівневі оптимізації. Було б розумно планувати їх вивчення тільки як наступний крок після вивчення мови JavaScript.
0 commit comments