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/4-data-structures/9-array-iteration/article.md
+7-9Lines changed: 7 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,7 @@
8
8
9
9
Метод ["arr.forEach(callback[, thisArg])"](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) используется для перебора массива.
10
10
11
-
Он для каждого элемента массива вызывает функцию `callback`.
11
+
Он для каждого элемента массива вызывает функцию `callback`.
12
12
13
13
Этой функции он передаёт три параметра `callback(item, i, arr)`:
14
14
@@ -120,17 +120,17 @@ alert( arr.some(isPositive) ); // true, есть хоть одно положи
120
120
121
121
Кроме `callback`, методу можно передать "начальное значение" -- аргумент `initialValue`. Если он есть, то на первом вызове значение `previousValue` будет равно `initialValue`, а если у `reduce` нет второго аргумента, то оно равно первому элементу массива, а перебор начинается со второго.
122
122
123
-
Проще всего понять работу метода `reduce` на примере.
123
+
Проще всего понять работу метода `reduce` на примере.
124
124
125
-
Например, в качестве "свёртки" мы хотим получить сумму всех элементов массива.
125
+
Например, в качестве "свёртки" мы хотим получить сумму всех элементов массива.
126
126
127
127
Вот решение в одну строку:
128
128
129
129
```js
130
130
//+ run
131
131
var arr = [1, 2, 3, 4, 5]
132
132
133
-
// для каждого элемента массива запустить функцию,
133
+
// для каждого элемента массива запустить функцию,
134
134
// промежуточный результат передавать первым аргументом далее
135
135
var result =arr.reduce(function(sum, current) {
136
136
return sum + current;
@@ -212,13 +212,11 @@ var result = arr.reduce(function(sum, current) {
212
212
alert( result ); // 15
213
213
```
214
214
215
-
Результат -- точно такой же! Это потому, что при отсутствии `initialValue` в качестве первого значения берётся первый элемент массива, а перебор стартует со второго.
215
+
Результат -- точно такой же! Это потому, что при отсутствии `initialValue` в качестве первого значения берётся первый элемент массива, а перебор стартует со второго.
216
216
217
217
Таблица вычислений будет такая же, за вычетом первой строки.
218
218
219
-
**Метод [arr.reduceRight](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduceRight) работает аналогично, но идёт по массиву справа-налево:**
220
-
221
-
219
+
**Метод [arr.reduceRight](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/reduceRight) работает аналогично, но идёт по массиву справа-налево.**
222
220
223
221
## Итого
224
222
@@ -232,4 +230,4 @@ alert( result ); // 15
232
230
</ul>
233
231
234
232
Во многих ситуациях их использование позволяет написать код короче и понятнее, чем обычный перебор через `for`.
Copy file name to clipboardExpand all lines: 1-js/5-functions-closures/6-memory-management/article.md
+13-13Lines changed: 13 additions & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@
17
17
</ul>
18
18
19
19
Эти значения гарантированно хранятся в памяти. Мы будем называть их *корнями*.
20
-
</li>
20
+
</li>
21
21
<li>**Любое другое значение сохраняется в памяти лишь до тех пор, пока доступно из корня по ссылке или цепочке ссылок.**</li>
22
22
</ol>
23
23
@@ -31,7 +31,7 @@
31
31
32
32
### Достижимость и наличие ссылок
33
33
34
-
Есть одно упрощение для работы с памятью: "значение остаётся в памяти, пока на него есть ссылка".
34
+
Есть одно упрощение для работы с памятью: "значение остаётся в памяти, пока на него есть хотя бы одна ссылка".
35
35
36
36
Но такое упрощение будет верным лишь в одну сторону.
37
37
@@ -47,7 +47,7 @@ var user = {
47
47
user =null;
48
48
```
49
49
50
-
Теперь объект `{ name: "Вася" }` более недоступен. Память будет освобождена.
50
+
Теперь объект `{ name: "Вася" }` более недоступен. Память будет освобождена.
51
51
</li>
52
52
<li>**Неверно -- в другую сторону: наличие ссылки не гарантирует, что значение останется в памяти.**
53
53
@@ -62,9 +62,9 @@ petya.friend = vasya;
62
62
vasya = petya =null;
63
63
```
64
64
65
-
Несмотря на то, что на объекты `vasya`, `petya` ссылаются друг на друга через ссылку `friend`, то есть можно сказать, что на каждый из них есть ссылка, последняя строка делает эти объекты в совокупности недостижимыми.
65
+
Несмотря на то, что на объекты `vasya`, `petya` ссылаются друг на друга через ссылку `friend`, то есть можно сказать, что на каждый из них есть ссылка, последняя строка делает эти объекты в совокупности недостижимыми.
66
66
67
-
Поэтому они будут удалены из памяти.
67
+
Поэтому они будут удалены из памяти.
68
68
69
69
Здесь как раз и играет роль "достижимость" -- оба этих объекта становятся недостижимы из корней, в первую очередь, из глобальной области, стека.
70
70
@@ -138,7 +138,7 @@ window.family = null;
138
138
Как видим, объекты в конструкции всё ещё связаны между собой. Однако, поиск от корня их не находит, они не достижимы, и значит сборщик мусора удалит их из памяти.
139
139
140
140
[smart header="Оптимизации"]
141
-
Проблема описанного алгоритма -- в больших задержках. Если объектов много, то на поиск всех достижимых уйдёт довольно много времени. А ведь выполнение скрипта при этом должно быть остановлено, уже просканированные объекты не должны поменяться до окончания процесса. Получатся небольшие, но неприятные паузы-зависания в работе скрипта.
141
+
Проблема описанного алгоритма -- в больших задержках. Если объектов много, то на поиск всех достижимых уйдёт довольно много времени. А ведь выполнение скрипта при этом должно быть остановлено, уже просканированные объекты не должны поменяться до окончания процесса. Получатся небольшие, но неприятные паузы-зависания в работе скрипта.
142
142
143
143
Поэтому современные интерпретаторы применяют различные оптимизации.
144
144
@@ -157,7 +157,7 @@ function showTime() {
157
157
158
158
## Замыкания
159
159
160
-
Объекты переменных, о которых шла речь ранее, в главе про замыкания, также подвержены сборке мусора. Они следуют тем же правилам, что и обычные объекты.
160
+
Объекты переменных, о которых шла речь ранее, в главе про замыкания, также подвержены сборке мусора. Они следуют тем же правилам, что и обычные объекты.
161
161
162
162
Объект переменных внешней функции существует в памяти до тех пор, пока существует хоть одна внутренняя функция, ссылающаяся на него через свойство `[[Scope]]`.
163
163
@@ -206,7 +206,7 @@ function f() {
206
206
returnfunction() {};
207
207
}
208
208
209
-
// 3 функции, каждая ссылается на свой объект переменных,
209
+
// 3 функции, каждая ссылается на свой объект переменных,
210
210
// каждый со своим значением value
211
211
var arr = [f(), f(), f()];
212
212
```
@@ -224,15 +224,15 @@ function f() {
224
224
}
225
225
226
226
var g =f(); // функция g жива
227
-
// а значит в памяти остается соответствующий объект переменных f()
227
+
// а значит в памяти остается соответствующий объект переменных f()
228
228
229
229
g =null; // ..а вот теперь память будет очищена
230
230
```
231
231
232
232
</li>
233
233
</ul>
234
234
235
-
### Оптимизация в V8 и её последствия
235
+
### Оптимизация в V8 и её последствия
236
236
237
237
Современные JS-движки делают оптимизации замыканий по памяти. Они анализируют использование переменных и в случае, когда переменная из замыкания абсолютно точно не используется, удаляют её.
238
238
@@ -286,7 +286,7 @@ g();
286
286
Это не глюк отладчика, а особенность работы V8, которая, возможно, будет когда-нибудь изменена. Вы всегда сможете проверить, не изменилось ли чего, запустив примеры на этой странице.
287
287
[/warn]
288
288
289
-
## Влияние управления памятью на скорость
289
+
## Влияние управления памятью на скорость
290
290
291
291
На создание новых объектов и их удаление тратится время. Это важно иметь в виду в случае, когда важна производительность.
alert( "Разница в "+ (timeRecursion / timeLoop) +" раз" );
320
320
```
321
321
322
-
Различие в скорости на таком примере может составлять, в зависимости от интерпретатора, 2-10 раз.
322
+
Различие в скорости на таком примере может составлять, в зависимости от интерпретатора, 2-10 раз.
323
323
324
324
Вообще, этот пример -- не показателен. Ещё раз обращаю ваше внимание на то, что такие искусственные "микротесты" часто врут. Правильно их делать -- отдельная наука, которая выходит за рамки этой главы. Но и на практике ускорение в 2-10 раз оптимизацией по количеству объектов (и вообще, любых значений) -- отнюдь не миф, а вполне достижимо.
325
325
326
-
В реальной жизни в большинстве ситуаций такая оптимизация несущественна, просто потому что "JavaScript и так достаточно быстр". Но она может быть эффективной для "узких мест" кода.
326
+
В реальной жизни в большинстве ситуаций такая оптимизация несущественна, просто потому что "JavaScript и так достаточно быстр". Но она может быть эффективной для "узких мест" кода.
0 commit comments