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/10-arguments-pseudoarray/article.md
+15-9Lines changed: 15 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -37,7 +37,9 @@ log(a,b,c); // вызовется вторая функция
37
37
38
38
Это называется "полиморфизмом функций" или "перегрузкой функций". В JavaScript ничего подобного нет.
39
39
40
-
**Может быть только одна функция с именем `log`, которая вызывается с любыми аргументами.** А уже внутри она может посмотреть, с чем вызвана и по-разному отработать.
40
+
**Может быть только одна функция с именем `log`, которая вызывается с любыми аргументами.**
41
+
42
+
А уже внутри она может посмотреть, с чем вызвана и по-разному отработать.
41
43
42
44
В примере выше второе объявление `log` просто переопределит первое.
В старом стандарте JavaScript объект `arguments` не только хранил список аргументов, но и содержал в свойстве `arguments.callee` ссылку на функцию, которая выполняется в данный момент.
337
-
338
339
[warn header="Используйте NFE вместо `arguments.callee`"]
339
-
Это свойство устарело, при `use strict` оно не работает, но ещё встречается в старом коде, поэтому о нём желательно знать.
340
+
Это свойство устарело, при `use strict` оно не работает.
341
+
342
+
Единственная причина, по которой оно тут -- это то, что его можно встретить в старом коде, поэтому о нём желательно знать.
340
343
341
344
Современная спецификация рекомендует использовать ["именованные функциональные выражения (NFE)"](#functions-nfe).
345
+
342
346
[/warn]
343
347
348
+
В старом стандарте JavaScript объект `arguments` не только хранил список аргументов, но и содержал в свойстве `arguments.callee` ссылку на функцию, которая выполняется в данный момент.
349
+
344
350
Например:
345
351
346
352
```js
@@ -366,7 +372,7 @@ var factorial = function(n) {
366
372
};
367
373
```
368
374
369
-
В учебнике мы его использовать не будем, оно приведено для общего ознакомления, так как пока ещё много старого кода использует его.
375
+
В учебнике мы его использовать не будем, оно приведено для общего ознакомления.
370
376
371
377
### arguments.callee.caller
372
378
@@ -375,7 +381,7 @@ var factorial = function(n) {
375
381
[warn header="Это свойство тоже устарело"]
376
382
Это свойство было в старом стандарте, при `use strict` оно не работает, как и `arguments.callee`.
377
383
378
-
Также ранее существовало похожее свойство `arguments.caller` (без `callee`). Но это уже вообще раритет, оно даже не кросс-браузерное. А вот свойство `arguments.callee.caller` поддерживается везде, если не использован `use strict`, поэтому в старом коде оно встречается.
384
+
Также ранее существовало более короткое свойство `arguments.caller`. Но это уже раритет, оно даже не кросс-браузерное. А вот свойство `arguments.callee.caller` поддерживается везде, если не использован `use strict`, поэтому в старом коде оно встречается.
<dd>Дату можно создать, используя компоненты в местной временной зоне. Для этого формата обязательны только первые два аргумента. Отсутствующие параметры, начиная с `hours` считаются равными нулю, а `date` -- единице.
35
35
36
-
**Заметим, что год `year` должен быть из 4 цифр, а отсчет месяцев `month` начинается с нуля 0.** Например:
36
+
Заметим:
37
+
<ul>
38
+
<li>Год `year` должен быть из 4 цифр.</li>
39
+
<li>Отсчет месяцев `month` начинается с нуля 0.</li>
40
+
</ul>
41
+
42
+
Например:
37
43
38
44
```js
39
-
newDate(2011, 0, 1) // 1 января 2011, 00:00:00 в местной временной зоне
40
-
newDate(2011, 0) // то же самое, date по умолчанию равно 1
Некоторые браузеры реализуют нестандартный метод `getYear()`. Где-то он возвращает только две цифры из года, где-то четыре. Так или иначе, этот метод отсутствует в стандарте JavaScript. Не используйте его. Для получения года есть `getFullYear()`.
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() );
92
102
```
93
103
94
104
Кроме описанных выше, существуют два специальных метода без UTC-варианта:
95
105
96
106
<dl>
97
107
<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>
99
109
<dt>`getTimezoneOffset()`</dt>
100
110
<dd>Возвращает разницу между местным и UTC-временем, в минутах.
[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
+
Так что это время включает в себя всё, включая начальное обращение к серверу.
300
312
301
313
Его можно посмотреть в любом месте страницы, даже в `<head>`, чтобы узнать, сколько времени потребовалось браузеру, чтобы до него добраться, включая загрузку HTML.
<li>Автоматически выносят инвариант, то есть постоянное в цикле значение типа `arr.length`, за пределы цикла.</li>
349
361
<li>Стараются понять, значения какого типа хранит данная переменная или массив, какую структуру имеет объект и, исходя из этого, оптимизировать внутренние алгоритмы.</li>
350
362
<li>Выполняют простейшие операции, например сложение явно заданных чисел и строк, на этапе компиляции.</li>
351
-
<li>В теории, могут выкинуть код, который ни на что не влияет, например присваивание к неиспользуемой локальной переменной, хотя делают это редко.</li>
363
+
<li>Могут обнаружить, что некий код, например присваивание к неиспользуемой локальной переменной, ни на что не влияет и вообще исключить его из выполнения, хотя делают это редко.</li>
352
364
</ol>
353
-
Они могут влиять на результаты тестов.
365
+
Эти оптимизации могут влиять на результаты тестов, поэтому измерять скорость базовых операций JavaScript ("проводить миробенчмаркинг") до того, как вы изучите внутренности JavaScript-интерпретаторов и поймёте, что они реально делают на таком коде, не рекомендуется.
354
366
[/warn]
355
367
356
368
357
-
## Форматирование
369
+
## Форматирование и вывод дат
358
370
359
371
Во всех браузерах, кроме IE10-, поддерживается новый стандарт [Ecma 402](http://www.ecma-international.org/publications/standards/Ecma-402.htm), который добавляет специальные методы для форматирования дат.
360
372
361
-
Это делается взыовом`date.toLocaleString(локаль, опции)`, у которого много настроек. Он позволяет указать, какие параметры даты нужно вывести, и ряд настроек вывода, после чего интерпретатор сам сформирует строку.
373
+
Это делается вызовом`date.toLocaleString(локаль, опции)`, в котором можно задать много настроек. Он позволяет указать, какие параметры даты нужно вывести, и ряд настроек вывода, после чего интерпретатор сам сформирует строку.
362
374
363
375
Пример с почти всеми параметрами даты и русским, затем английским (США) форматированием:
<dd>Возвращают стандартное строчное представление, не указанное в стандарте, а зависящее от браузера. Единственное требование - читаемость человеком. Метод `toString` возвращает дату целиком, `toDateString()` и `toTimeString()` - только дату и время соответственно.
404
+
<dd>Возвращают стандартное строчное представление, не заданное жёстко в стандарте, а зависящее от браузера. Единственное требование к нему -- читаемость человеком. Метод `toString` возвращает дату целиком, `toDateString()` и `toTimeString()`-- только дату и время соответственно.
**Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например [Moment.JS](http://momentjs.com/) или написать свою функцию.**
428
+
Если хочется иметь большую гибкость и кросс-браузерность, то также можно воспользоваться специальной библиотекой, например [Moment.JS](http://momentjs.com/) или написать свою функцию форматирования.
417
429
418
430
419
431
420
432
## Разбор строки, Date.parse
421
433
422
434
Все современные браузеры, включая IE9+, понимают даты в упрощённом формате ISO 8601 Extended.
423
435
424
-
Этот формат выглядит так: `YYYY-MM-DDTHH:mm:ss.sssZ`. Для разделения даты и времени в нем используется символ `'T'`. Часть `'Z'` обозначает (необязательную) временную зону -- она может отсутствовать, тогда зона UTC, либо может быть символ `z` -- тоже UTC, или зона в формате `+-hh:mm`.
436
+
Этот формат выглядит так: `YYYY-MM-DDTHH:mm:ss.sssZ`, где:
425
437
426
-
Также возможны упрощенные варианты, к примеру:
438
+
<ul>
439
+
<li>`YYYY-MM-DD` -- дата в формате год-месяц-день.</li>
440
+
<li>Обычный символ `T` используется как разделитель.</li>
<li>Часть `'Z'` обозначает временную зону -- в формате `+-hh:mm`, либо символ `Z`, обозначающий UTC. По стандарту её можно не указывать, тогда UTC, но в Safari с этим ошибка, так что лучше указывать всегда.</li>
443
+
</ul>
427
444
428
-
```js
429
-
YYYY
430
-
YYYY-MM
431
-
YYYY-MM-DD
432
-
```
445
+
Также возможны укороченные варианты, например `YYYY-MM-DD` или `YYYY-MM` или даже только `YYYY`.
433
446
434
447
Метод `Date.parse(str)` разбирает строку `str` в таком формате и возвращает соответствующее ей количество миллисекунд. Если это невозможно, `Date.parse` возвращает `NaN`.
435
448
436
-
На момент написания некоторые браузеры (Safari) воспринимали формат без `'Z'` как дату в локальной таймзоне (по стандарту UTC), поэтому пример ниже в них работает некорректно:
449
+
Например:
437
450
438
451
```js
439
452
//+ run
440
-
varmsNoZone=Date.parse('2012-01-26T13:51:50.417'); //без зоны, значит UTC
453
+
varmsUTC=Date.parse('2012-01-26T13:51:50.417Z'); //зона UTC
С таймзоной `-07:00GMT` в конце все современные браузеры работают правильно:
458
+
С таймзоной `-07:00GMT`:
449
459
450
460
```js
451
461
//+ run
@@ -454,6 +464,7 @@ var ms = Date.parse('2012-01-26T13:51:50.417-07:00');
454
464
alert(ms); // 1327611110417 (число миллисекунд)
455
465
```
456
466
467
+
457
468
[smart header="Формат дат для IE8-"]
458
469
До появления спецификации EcmaScript 5 формат не был стандартизован, и браузеры, включая IE8-, имели свои собственные форматы дат. Частично, эти форматы пересекаются.
0 commit comments