Skip to content

Commit e194813

Browse files
committed
renovations
1 parent c7d4c7e commit e194813

170 files changed

Lines changed: 1468 additions & 1133 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1-js/4-data-structures/10-arguments-pseudoarray/article.md

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ log(a,b,c); // вызовется вторая функция
3737

3838
Это называется "полиморфизмом функций" или "перегрузкой функций". В JavaScript ничего подобного нет.
3939

40-
**Может быть только одна функция с именем `log`, которая вызывается с любыми аргументами.** А уже внутри она может посмотреть, с чем вызвана и по-разному отработать.
40+
**Может быть только одна функция с именем `log`, которая вызывается с любыми аргументами.**
41+
42+
А уже внутри она может посмотреть, с чем вызвана и по-разному отработать.
4143

4244
В примере выше второе объявление `log` просто переопределит первое.
4345
[/smart]
@@ -142,9 +144,7 @@ for(var i=0; i<arguments.length; i++) {
142144

143145
Такие объекты иногда называют *"коллекциями"* или *"псевдомассивами"*.
144146

145-
## Примеры работы с аргументами
146-
147-
### Копирование объектов copy(dst, src1, src2...) [#copy]
147+
## Пример: копирование свойств copy(dst, src1, src2...) [#copy]
148148

149149
Иногда встаёт задача -- скопировать в существующий объект свойства из одного или нескольких других.
150150

@@ -206,12 +206,14 @@ var userClone = copy({}, user);
206206
//+ autorun
207207
function copy() {
208208
var dst = arguments[0];
209+
209210
for (var i=1; i<arguments.length; i++) {
210211
var arg = arguments[i];
211212
for (var key in arg) {
212213
dst[key] = arg[key];
213214
}
214215
}
216+
215217
return dst;
216218
}
217219
```
@@ -229,6 +231,7 @@ function copy(dst) {
229231
dst[key] = arg[key];
230232
}
231233
}
234+
232235
return dst;
233236
}
234237
```
@@ -333,14 +336,17 @@ showWarning(opts); // вызвать с новым текстом, без коп
333336
334337
## Устаревшее свойство arguments.callee [#arguments-callee]
335338
336-
В старом стандарте JavaScript объект `arguments` не только хранил список аргументов, но и содержал в свойстве `arguments.callee` ссылку на функцию, которая выполняется в данный момент.
337-
338339
[warn header="Используйте NFE вместо `arguments.callee`"]
339-
Это свойство устарело, при `use strict` оно не работает, но ещё встречается в старом коде, поэтому о нём желательно знать.
340+
Это свойство устарело, при `use strict` оно не работает.
341+
342+
Единственная причина, по которой оно тут -- это то, что его можно встретить в старом коде, поэтому о нём желательно знать.
340343
341344
Современная спецификация рекомендует использовать ["именованные функциональные выражения (NFE)"](#functions-nfe).
345+
342346
[/warn]
343347
348+
В старом стандарте JavaScript объект `arguments` не только хранил список аргументов, но и содержал в свойстве `arguments.callee` ссылку на функцию, которая выполняется в данный момент.
349+
344350
Например:
345351
346352
```js
@@ -366,7 +372,7 @@ var factorial = function(n) {
366372
};
367373
```
368374
369-
В учебнике мы его использовать не будем, оно приведено для общего ознакомления, так как пока ещё много старого кода использует его.
375+
В учебнике мы его использовать не будем, оно приведено для общего ознакомления.
370376
371377
### arguments.callee.caller
372378
@@ -375,7 +381,7 @@ var factorial = function(n) {
375381
[warn header="Это свойство тоже устарело"]
376382
Это свойство было в старом стандарте, при `use strict` оно не работает, как и `arguments.callee`.
377383
378-
Также ранее существовало похожее свойство `arguments.caller` (без `callee`). Но это уже вообще раритет, оно даже не кросс-браузерное. А вот свойство `arguments.callee.caller` поддерживается везде, если не использован `use strict`, поэтому в старом коде оно встречается.
384+
Также ранее существовало более короткое свойство `arguments.caller`. Но это уже раритет, оно даже не кросс-браузерное. А вот свойство `arguments.callee.caller` поддерживается везде, если не использован `use strict`, поэтому в старом коде оно встречается.
379385
[/warn]
380386
381387
Пример работы:

1-js/4-data-structures/11-datetime/article.md

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,29 @@ alert( Jan02_1970 );
2929

3030
</dd>
3131
<dt>`new Date(datestring)`</dt>
32-
<dd>Если единственный аргумент - строка, используется вызов `Date.parse` для ее разбора.</dd>
32+
<dd>Если единственный аргумент - строка, используется вызов `Date.parse` (см. далее) для чтения даты из неё.</dd>
3333
<dt>`new Date(year, month, date, hours, minutes, seconds, ms)`</dt>
3434
<dd>Дату можно создать, используя компоненты в местной временной зоне. Для этого формата обязательны только первые два аргумента. Отсутствующие параметры, начиная с `hours` считаются равными нулю, а `date` -- единице.
3535

36-
**Заметим, что год `year` должен быть из 4 цифр, а отсчет месяцев `month` начинается с нуля 0.** Например:
36+
Заметим:
37+
<ul>
38+
<li>Год `year` должен быть из 4 цифр.</li>
39+
<li>Отсчет месяцев `month` начинается с нуля 0.</li>
40+
</ul>
41+
42+
Например:
3743

3844
```js
39-
new Date(2011, 0, 1) // 1 января 2011, 00:00:00 в местной временной зоне
40-
new Date(2011, 0) // то же самое, date по умолчанию равно 1
41-
new Date(2011, 0, 1, 0, 0, 0, 0); // то же самое
45+
new Date(2011, 0, 1, 0, 0, 0, 0); // // 1 января 2011, 00:00:00
46+
new Date(2011, 0, 1); // то же самое, часы/секунды по умолчанию равны 0
4247
```
4348

4449
Дата задана с точностью до миллисекунд:
4550

4651
```js
4752
//+ run
48-
var d = new Date(2011, 0, 1, 2, 3, 4, 567);
49-
alert(d); // 1.01.2011, 02:03:04.567
53+
var date = new Date(2011, 0, 1, 2, 3, 4, 567);
54+
alert(date); // 1.01.2011, 02:03:04.567
5055
```
5156

5257
</dd>
@@ -67,7 +72,7 @@ alert(d); // 1.01.2011, 02:03:04.567
6772
<dd>Получить соответствующие компоненты.</dd>
6873
</dl>
6974

70-
[warn header="Устаревший `getYear()`"]
75+
[warn header="Не `getYear()`, а `getFullYear()`"]
7176
Некоторые браузеры реализуют нестандартный метод `getYear()`. Где-то он возвращает только две цифры из года, где-то четыре. Так или иначе, этот метод отсутствует в стандарте JavaScript. Не используйте его. Для получения года есть `getFullYear()`.
7277
[/warn]
7378

@@ -85,17 +90,22 @@ alert(d); // 1.01.2011, 02:03:04.567
8590

8691
```js
8792
//+ run
93+
// текущая дата
8894
var date = new Date();
8995

90-
alert( date.getHours() ); // час в вашей зоне для даты date
91-
alert( date.getUTCHours() ); // час в зоне GMT+0 для даты date
96+
// час в текущей временной зоне
97+
alert( date.getHours() );
98+
99+
// сколько сейчас времени в Лондоне?
100+
// час в зоне GMT+0
101+
alert( date.getUTCHours() );
92102
```
93103

94104
Кроме описанных выше, существуют два специальных метода без UTC-варианта:
95105

96106
<dl>
97107
<dt>`getTime()`</dt>
98-
<dd>Возвращает число миллисекунд, прошедших с 01.01.1970 00:00:00 UTC. Это то же число, которое используется в конструкторе `new Date(milliseconds)`.</dd>
108+
<dd>Возвращает число миллисекунд, прошедших с 1 января 1970 года GMT+0, то есть того же вида, который используется в конструкторе `new Date(milliseconds)`.</dd>
99109
<dt>`getTimezoneOffset()`</dt>
100110
<dd>Возвращает разницу между местным и UTC-временем, в минутах.
101111

@@ -296,7 +306,9 @@ alert('Время walkLength: ' +timeLength + 'мс');
296306
```
297307
298308
[smart header="Более точное время с `performance.now()`"]
299-
В современных браузерах (кроме IE9-) вызов [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/performance.now) возвращает количество миллисекунд, прошедшее с начала загрузки страницы, а если точнее -- с момента выгрузки предыдущей страницы из памяти.
309+
В современных браузерах (кроме IE9-) вызов [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/performance.now) возвращает количество миллисекунд, прошедшее с начала загрузки страницы. Причём именно с самого начала, до того, как загрузился HTML-файл, если точнее -- с момента выгрузки предыдущей страницы из памяти.
310+
311+
Так что это время включает в себя всё, включая начальное обращение к серверу.
300312
301313
Его можно посмотреть в любом месте страницы, даже в `<head>`, чтобы узнать, сколько времени потребовалось браузеру, чтобы до него добраться, включая загрузку HTML.
302314
@@ -348,17 +360,17 @@ console.timeEnd("All Benchmarks");
348360
<li>Автоматически выносят инвариант, то есть постоянное в цикле значение типа `arr.length`, за пределы цикла.</li>
349361
<li>Стараются понять, значения какого типа хранит данная переменная или массив, какую структуру имеет объект и, исходя из этого, оптимизировать внутренние алгоритмы.</li>
350362
<li>Выполняют простейшие операции, например сложение явно заданных чисел и строк, на этапе компиляции.</li>
351-
<li>В теории, могут выкинуть код, который ни на что не влияет, например присваивание к неиспользуемой локальной переменной, хотя делают это редко.</li>
363+
<li>Могут обнаружить, что некий код, например присваивание к неиспользуемой локальной переменной, ни на что не влияет и вообще исключить его из выполнения, хотя делают это редко.</li>
352364
</ol>
353-
Они могут влиять на результаты тестов.
365+
Эти оптимизации могут влиять на результаты тестов, поэтому измерять скорость базовых операций JavaScript ("проводить миробенчмаркинг") до того, как вы изучите внутренности JavaScript-интерпретаторов и поймёте, что они реально делают на таком коде, не рекомендуется.
354366
[/warn]
355367
356368
357-
## Форматирование
369+
## Форматирование и вывод дат
358370
359371
Во всех браузерах, кроме IE10-, поддерживается новый стандарт [Ecma 402](http://www.ecma-international.org/publications/standards/Ecma-402.htm), который добавляет специальные методы для форматирования дат.
360372
361-
Это делается взыовом `date.toLocaleString(локаль, опции)`, у которого много настроек. Он позволяет указать, какие параметры даты нужно вывести, и ряд настроек вывода, после чего интерпретатор сам сформирует строку.
373+
Это делается вызовом `date.toLocaleString(локаль, опции)`, в котором можно задать много настроек. Он позволяет указать, какие параметры даты нужно вывести, и ряд настроек вывода, после чего интерпретатор сам сформирует строку.
362374
363375
Пример с почти всеми параметрами даты и русским, затем английским (США) форматированием:
364376
@@ -389,7 +401,7 @@ alert( date.toLocaleString("en-US", options) ); // Wednesday, December 31, 2014
389401
390402
<dl>
391403
<dt>`toString()`, `toDateString()`, `toTimeString()`</dt>
392-
<dd>Возвращают стандартное строчное представление, не указанное в стандарте, а зависящее от браузера. Единственное требование - читаемость человеком. Метод `toString` возвращает дату целиком, `toDateString()` и `toTimeString()` - только дату и время соответственно.
404+
<dd>Возвращают стандартное строчное представление, не заданное жёстко в стандарте, а зависящее от браузера. Единственное требование к нему -- читаемость человеком. Метод `toString` возвращает дату целиком, `toDateString()` и `toTimeString()` -- только дату и время соответственно.
393405
394406
```js
395407
//+ run
@@ -413,39 +425,37 @@ alert( d.toISOString() ); // вывод, похожий на '2011-01-26T13:51:5
413425
414426
</dd></dl>
415427
416-
**Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например [Moment.JS](http://momentjs.com/) или написать свою функцию.**
428+
Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например [Moment.JS](http://momentjs.com/) или написать свою функцию форматирования.
417429
418430
419431
420432
## Разбор строки, Date.parse
421433
422434
Все современные браузеры, включая IE9+, понимают даты в упрощённом формате ISO 8601 Extended.
423435
424-
Этот формат выглядит так: `YYYY-MM-DDTHH:mm:ss.sssZ`. Для разделения даты и времени в нем используется символ `'T'`. Часть `'Z'` обозначает (необязательную) временную зону -- она может отсутствовать, тогда зона UTC, либо может быть символ `z` -- тоже UTC, или зона в формате `+-hh:mm`.
436+
Этот формат выглядит так: `YYYY-MM-DDTHH:mm:ss.sssZ`, где:
425437
426-
Также возможны упрощенные варианты, к примеру:
438+
<ul>
439+
<li>`YYYY-MM-DD` -- дата в формате год-месяц-день.</li>
440+
<li>Обычный символ `T` используется как разделитель.</li>
441+
<li>`HH:mm:ss.sss` -- время: часы-минуты-секунды-миллисекунды.</li>
442+
<li>Часть `'Z'` обозначает временную зону -- в формате `+-hh:mm`, либо символ `Z`, обозначающий UTC. По стандарту её можно не указывать, тогда UTC, но в Safari с этим ошибка, так что лучше указывать всегда.</li>
443+
</ul>
427444
428-
```js
429-
YYYY
430-
YYYY-MM
431-
YYYY-MM-DD
432-
```
445+
Также возможны укороченные варианты, например `YYYY-MM-DD` или `YYYY-MM` или даже только `YYYY`.
433446
434447
Метод `Date.parse(str)` разбирает строку `str` в таком формате и возвращает соответствующее ей количество миллисекунд. Если это невозможно, `Date.parse` возвращает `NaN`.
435448
436-
На момент написания некоторые браузеры (Safari) воспринимали формат без `'Z'` как дату в локальной таймзоне (по стандарту UTC), поэтому пример ниже в них работает некорректно:
449+
Например:
437450
438451
```js
439452
//+ run
440-
var msNoZone = Date.parse('2012-01-26T13:51:50.417'); // без зоны, значит UTC
453+
var msUTC = Date.parse('2012-01-26T13:51:50.417Z'); // зона UTC
441454

442-
alert(msNoZone); // 1327571510417 (число миллисекунд)
443-
444-
var msZ = Date.parse('2012-01-26T13:51:50.417z'); // зона z означает UTC
445-
alert(msZ == msNoZone); // true, если браузер правильный
455+
alert(msUTC); // 1327571510417 (число миллисекунд)
446456
```
447457
448-
С таймзоной `-07:00 GMT` в конце все современные браузеры работают правильно:
458+
С таймзоной `-07:00 GMT`:
449459
450460
```js
451461
//+ run
@@ -454,6 +464,7 @@ var ms = Date.parse('2012-01-26T13:51:50.417-07:00');
454464
alert(ms); // 1327611110417 (число миллисекунд)
455465
```
456466
467+
457468
[smart header="Формат дат для IE8-"]
458469
До появления спецификации EcmaScript 5 формат не был стандартизован, и браузеры, включая IE8-, имели свои собственные форматы дат. Частично, эти форматы пересекаются.
459470

0 commit comments

Comments
 (0)