ÐÐ»Ñ ÑабоÑÑ Ñ Ð´Ð°Ñой и вÑеменем в JavaScript иÑполÑзÑÑÑÑÑ Ð¾Ð±ÑекÑÑ Date.
Создание
ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обÑекÑа Ñипа Date иÑполÑзÑеÑÑÑ Ð¾Ð´Ð¸Ð½ из ÑинÑакÑиÑов:
new Date()-
СоздаÑÑ Ð¾Ð±ÑекÑ
DateÑ ÑекÑÑей даÑой и вÑеменем:var now = new Date(); alert( now ); new Date(milliseconds)-
СоздаÑÑ Ð¾Ð±ÑекÑ
Date, знаÑение коÑоÑого Ñавно колиÑеÑÑÐ²Ñ Ð¼Ð¸Ð»Ð»Ð¸ÑекÑнд (1/1000 ÑекÑндÑ), пÑоÑедÑÐ¸Ñ Ñ 1 ÑнваÑÑ 1970 года GMT+0.// 24 ÑаÑа поÑле 01.01.1970 GMT+0 var Jan02_1970 = new Date(3600 * 24 * 1000); alert( Jan02_1970 ); new Date(datestring)-
ÐÑли единÑÑвеннÑй аÑгÑÐ¼ÐµÐ½Ñ â ÑÑÑока, иÑполÑзÑеÑÑÑ Ð²Ñзов
Date.parse(Ñм. далее) Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð´Ð°ÑÑ Ð¸Ð· неÑ. new Date(year, month, date, hours, minutes, seconds, ms)-
ÐаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаÑÑ, иÑполÑзÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ Ð² меÑÑной вÑеменной зоне. ÐÐ»Ñ ÑÑого ÑоÑмаÑа обÑзаÑелÑÐ½Ñ ÑолÑко пеÑвÑе два аÑгÑменÑа. ÐÑÑÑÑÑÑвÑÑÑие паÑамеÑÑÑ, наÑÐ¸Ð½Ð°Ñ Ñ
hoursÑÑиÑаÑÑÑÑ ÑавнÑми нÑлÑ, аdateâ единиÑе.ÐамеÑим:
-
Ðод
yearдолжен бÑÑÑ Ð¸Ð· 4 ÑиÑÑ. -
ÐÑÑÑÑÑ Ð¼ÐµÑÑÑев
monthнаÑинаеÑÑÑ Ñ Ð½ÑÐ»Ñ 0.ÐапÑимеÑ:
new Date(2011, 0, 1, 0, 0, 0, 0); // // 1 ÑнваÑÑ 2011, 00:00:00 new Date(2011, 0, 1); // Ñо же Ñамое, ÑаÑÑ/ÑекÑÐ½Ð´Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÑÐ°Ð²Ð½Ñ 0ÐаÑа задана Ñ ÑоÑноÑÑÑÑ Ð´Ð¾ миллиÑекÑнд:
var date = new Date(2011, 0, 1, 2, 3, 4, 567); alert( date ); // 1.01.2011, 02:03:04.567
ÐолÑÑение компоненÑов даÑÑ
ÐÐ»Ñ Ð´Ð¾ÑÑÑпа к компоненÑам даÑÑ-вÑемени обÑекÑа Date иÑполÑзÑÑÑÑÑ ÑледÑÑÑие меÑодÑ:
getFullYear()- ÐолÑÑиÑÑ Ð³Ð¾Ð´ (из 4 ÑиÑÑ)
getMonth()- ÐолÑÑиÑÑ Ð¼ÐµÑÑÑ, Ð¾Ñ 0 до 11.
getDate()- ÐолÑÑиÑÑ ÑиÑло меÑÑÑа, Ð¾Ñ 1 до 31.
getHours(), getMinutes(), getSeconds(), getMilliseconds()- ÐолÑÑиÑÑ ÑооÑвеÑÑÑвÑÑÑие компоненÑÑ.
getYear(), а getFullYear()ÐекоÑоÑÑе бÑаÑзеÑÑ ÑеализÑÑÑ Ð½ÐµÑÑандаÑÑнÑй меÑод getYear(). Ðде-Ñо он возвÑаÑÐ°ÐµÑ ÑолÑко две ÑиÑÑÑ Ð¸Ð· года, где-Ñо ÑеÑÑÑе. Так или инаÑе, ÑÑÐ¾Ñ Ð¼ÐµÑод оÑÑÑÑÑÑвÑÐµÑ Ð² ÑÑандаÑÑе JavaScript. Ðе иÑполÑзÑйÑе его. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð³Ð¾Ð´Ð° еÑÑÑ getFullYear().
ÐополниÑелÑно можно полÑÑиÑÑ Ð´ÐµÐ½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸:
getDay()- ÐолÑÑиÑÑ Ð½Ð¾Ð¼ÐµÑ Ð´Ð½Ñ Ð² неделе. ÐÐµÐ´ÐµÐ»Ñ Ð² JavaScript наÑинаеÑÑÑ Ñ Ð²Ð¾ÑкÑеÑенÑÑ, Ñак ÑÑо ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ ÑиÑлом Ð¾Ñ 0(воÑкÑеÑенÑе) до 6(ÑÑббоÑа).
ÐÑе меÑодÑ, ÑказаннÑе вÑÑе, возвÑаÑаÑÑ ÑезÑлÑÑÐ°Ñ Ð´Ð»Ñ Ð¼ÐµÑÑной вÑеменной зонÑ.
СÑÑеÑÑвÑÑÑ Ñакже UTC-ваÑианÑÑ ÑÑиÑ
меÑодов, возвÑаÑаÑÑие денÑ, меÑÑÑ, год и Ñ.п. Ð´Ð»Ñ Ð·Ð¾Ð½Ñ GMT+0 (UTC): getUTCFullYear(), getUTCMonth(), getUTCDay(). То еÑÑÑ, ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле "get" вÑÑавлÑеÑÑÑ "UTC".
ÐÑли ваÑе локалÑное вÑÐµÐ¼Ñ ÑдвинÑÑо оÑноÑиÑелÑно UTC, Ñо ÑледÑÑÑий код Ð¿Ð¾ÐºÐ°Ð¶ÐµÑ ÑазнÑе ÑаÑÑ:
// ÑекÑÑÐ°Ñ Ð´Ð°Ñа
var date = new Date();
// ÑÐ°Ñ Ð² ÑекÑÑей вÑеменной зоне
alert( date.getHours() );
// ÑколÑко ÑейÑÐ°Ñ Ð²Ñемени в Ðондоне?
// ÑÐ°Ñ Ð² зоне GMT+0
alert( date.getUTCHours() );
ÐÑоме опиÑаннÑÑ Ð²ÑÑе, ÑÑÑеÑÑвÑÑÑ Ð´Ð²Ð° ÑпеÑиалÑнÑÑ Ð¼ÐµÑода без UTC-ваÑианÑа:
getTime()-
ÐозвÑаÑÐ°ÐµÑ ÑиÑло миллиÑекÑнд, пÑоÑедÑÐ¸Ñ Ñ 1 ÑнваÑÑ 1970 года GMT+0, Ñо еÑÑÑ Ñого же вида, коÑоÑÑй иÑполÑзÑеÑÑÑ Ð² конÑÑÑÑкÑоÑе
new Date(milliseconds). getTimezoneOffset()-
ÐозвÑаÑÐ°ÐµÑ ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¼ÐµÑÑнÑм и UTC-вÑеменем, в минÑÑÐ°Ñ .
alert( new Date().getTimezoneOffset() ); // ÐÐ»Ñ GMT-1 вÑÐ²ÐµÐ´ÐµÑ 60
УÑÑановка компоненÑов даÑÑ
СледÑÑÑие меÑÐ¾Ð´Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ ÑÑÑанавливаÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ Ð´Ð°ÑÑ Ð¸ вÑемени:
setFullYear(year [, month, date])setMonth(month [, date])setDate(date)setHours(hour [, min, sec, ms])setMinutes(min [, sec, ms])setSeconds(sec [, ms])setMilliseconds(ms)setTime(milliseconds)(ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð²ÑÑ Ð´Ð°ÑÑ Ð¿Ð¾ миллиÑекÑндам Ñ 01.01.1970 UTC)
ÐÑе они, кÑоме setTime(), обладаÑÑ Ñакже UTC-ваÑианÑом, напÑимеÑ: setUTCHours().
Ðак видно, некоÑоÑÑе меÑÐ¾Ð´Ñ Ð¼Ð¾Ð³ÑÑ ÑÑÑанавливаÑÑ Ð½ÐµÑколÑко компоненÑов даÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно, в ÑаÑÑноÑÑи, setHours. ÐÑи ÑÑом еÑли какаÑ-Ñо компоненÑа не Ñказана, она не менÑеÑÑÑ. ÐапÑимеÑ:
var today = new Date;
today.setHours(0);
alert( today ); // ÑегоднÑ, но ÑÐ°Ñ Ð¸Ð·Ð¼ÐµÐ½Ñн на 0
today.setHours(0, 0, 0, 0);
alert( today ); // ÑегоднÑ, Ñовно 00:00:00.
ÐвÑоиÑпÑавление даÑÑ
ÐвÑоиÑпÑавление â оÑÐµÐ½Ñ Ñдобное ÑвойÑÑво обÑекÑов Date. Ðно заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо можно ÑÑÑанавливаÑÑ Ð·Ð°Ð²ÐµÐ´Ð¾Ð¼Ð¾ некоÑÑекÑнÑе компоненÑÑ (напÑÐ¸Ð¼ÐµÑ 32 ÑнваÑÑ), а обÑÐµÐºÑ Ñам ÑÐµÐ±Ñ Ð¿Ð¾Ð¿ÑавиÑ.
var d = new Date(2013, 0, 32); // 32 ÑнваÑÑ 2013 ?!?
alert(d); // ... ÑÑо 1 ÑевÑÐ°Ð»Ñ 2013!
ÐепÑавилÑнÑе компоненÑÑ Ð´Ð°ÑÑ Ð°Ð²ÑомаÑиÑеÑки ÑаÑпÑеделÑÑÑÑÑ Ð¿Ð¾ оÑÑалÑнÑм.
ÐапÑимеÑ, нÑжно ÑвелиÑиÑÑ Ð½Ð° 2 Ð´Ð½Ñ Ð´Ð°ÑÑ Â«28 ÑевÑÐ°Ð»Ñ 2011». ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ Ñак, ÑÑо ÑÑо бÑÐ´ÐµÑ 2 маÑÑа, а Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ 1 маÑÑа, еÑли год виÑокоÑнÑй. Ðо нам обо вÑем ÑÑом дÑмаÑÑ Ð½Ðµ нÑжно. ÐÑоÑÑо пÑибавлÑем два днÑ. ÐÑÑалÑное ÑÐ´ÐµÐ»Ð°ÐµÑ Date:
var d = new Date(2011, 1, 28);
d.setDate(d.getDate() + 2);
alert( d ); // 2 маÑÑа, 2011
Также ÑÑо иÑполÑзÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð°ÑÑ, оÑдалÑнной Ð¾Ñ Ð¸Ð¼ÐµÑÑейÑÑ Ð½Ð° нÑжнÑй пÑомежÑÑок вÑемени. ÐапÑимеÑ, полÑÑим даÑÑ Ð½Ð° 70 ÑекÑнд болÑÑÑÑ ÑекÑÑей:
var d = new Date();
d.setSeconds(d.getSeconds() + 70);
alert( d ); // вÑÐ²ÐµÐ´ÐµÑ ÐºÐ¾ÑÑекÑнÑÑ Ð´Ð°ÑÑ
Ðожно ÑÑÑановиÑÑ Ð¸ нÑлевÑе, и даже оÑÑиÑаÑелÑнÑе компоненÑÑ. ÐапÑимеÑ:
var d = new Date;
d.setDate(1); // поÑÑавиÑÑ Ð¿ÐµÑвое ÑиÑло меÑÑÑа
alert( d );
d.setDate(0); // нÑлевого ÑиÑла неÑ, бÑÐ´ÐµÑ Ð¿Ð¾Ñледнее ÑиÑло пÑедÑдÑÑего меÑÑÑа
alert( d );
var d = new Date;
d.setDate(-1); // пÑедпоÑледнее ÑиÑло пÑедÑдÑÑего меÑÑÑа
alert( d );
ÐÑеобÑазование к ÑиÑлÑ, ÑазноÑÑÑ Ð´Ð°Ñ
Ðогда обÑÐµÐºÑ Date иÑполÑзÑеÑÑÑ Ð² ÑиÑловом конÑекÑÑе, он пÑеобÑазÑеÑÑÑ Ð² колиÑеÑÑво миллиÑекÑнд:
alert(+new Date) // +date Ñо же Ñамое, ÑÑо: +date.valueOf()
ÐажнÑй побоÑнÑй ÑÑÑекÑ: даÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑÑиÑаÑÑ, ÑезÑлÑÑÐ°Ñ Ð²ÑÑиÑÐ°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов Date â иÑ
вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑазниÑа, в миллиÑекÑндаÑ
.
ÐÑо иÑполÑзÑÑÑ Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÑÐµÐ½Ð¸Ñ Ð²Ñемени:
var start = new Date; // заÑекли вÑемÑ
// ÑÑо-Ñо ÑделаÑÑ
for (var i = 0; i < 100000; i++) {
var doSomething = i * i * i;
}
var end = new Date; // ÐºÐ¾Ð½ÐµÑ Ð¸Ð·Ð¼ÐµÑениÑ
alert( "Цикл занÑл " + (end - start) + " ms" );
ÐенÑмаÑкинг
ÐопÑÑÑим, Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð½ÐµÑколÑко ваÑианÑов ÑеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñи, каждÑй опиÑан ÑÑнкÑией.
Ðак ÑзнаÑÑ, какой бÑÑÑÑее?
ÐÐ»Ñ Ð¿ÑимеÑа возÑмÑм две ÑÑнкÑии, коÑоÑÑе бегаÑÑ Ð¿Ð¾ маÑÑивÑ:
function walkIn(arr) {
for (var key in arr) arr[key]++
}
function walkLength(arr) {
for (var i = 0; i < arr.length; i++) arr[i]++;
}
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð¼ÐµÑиÑÑ, ÐºÐ°ÐºÐ°Ñ Ð¸Ð· ниÑ
бÑÑÑÑее, нелÑÐ·Ñ Ð·Ð°Ð¿ÑÑÑиÑÑ Ð¾Ð´Ð¸Ð½ Ñаз walkIn, один Ñаз walkLength и замеÑиÑÑ ÑазниÑÑ. ÐдноÑазовÑй запÑÑк ненадÑжен, лÑÐ±Ð°Ñ Ð¼Ð¸Ð½Ð¸-помеÑ
а иÑÐºÐ°Ð·Ð¸Ñ ÑезÑлÑÑаÑ.
ÐÐ»Ñ Ð¿ÑавилÑного бенÑмаÑкинга ÑÑнкÑÐ¸Ñ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ Ñаз, ÑÑÐ¾Ð±Ñ Ñам ÑеÑÑ Ð·Ð°Ð½Ñл ÑÑÑеÑÑвенное вÑемÑ. ÐÑо ÑведÑÑ Ð²Ð»Ð¸Ñние Ð¿Ð¾Ð¼ÐµÑ Ðº минимÑмÑ. СложнÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ запÑÑкаÑÑ 100 Ñаз, пÑоÑÑÑÑ â 1000 Ñазâ¦
ÐомеÑÑем, ÐºÐ°ÐºÐ°Ñ Ð¸Ð· ÑÑнкÑий бÑÑÑÑее:
var arr = [];
for (var i = 0; i < 1000; i++) arr[i] = 0;
function walkIn(arr) {
for (var key in arr) arr[key]++;
}
function walkLength(arr) {
for (var i = 0; i < arr.length; i++) arr[i]++;
}
function bench(f) {
var date = new Date();
for (var i = 0; i < 10000; i++) f(arr);
return new Date() - date;
}
alert( 'ÐÑÐµÐ¼Ñ walkIn: ' + bench(walkIn) + 'мÑ' );
alert( 'ÐÑÐµÐ¼Ñ walkLength: ' + bench(walkLength) + 'мÑ' );
ТепеÑÑ Ð¿ÑедÑÑавим Ñебе, ÑÑо во вÑÐµÐ¼Ñ Ð¿ÐµÑвого бенÑмаÑкинга bench(walkIn) компÑÑÑÐµÑ ÑÑо-Ñо делал паÑаллелÑно важное (вдÑÑг) и ÑÑо занимало ÑеÑÑÑÑÑ, а во вÑÐµÐ¼Ñ Ð²ÑоÑого â пеÑеÑÑал. РеалÑÐ½Ð°Ñ ÑиÑÑаÑиÑ? ÐонеÑно ÑеалÑна, оÑобенно на ÑовÑеменнÑÑ
ÐС, где много пÑоÑеÑÑов одновÑеменно.
ÐоÑаздо более надÑжнÑе ÑезÑлÑÑаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ, еÑли веÑÑ Ð¿Ð°ÐºÐµÑ ÑеÑÑов пÑогнаÑÑ Ð¼Ð½Ð¾Ð³Ð¾ Ñаз.
var arr = [];
for (var i = 0; i < 1000; i++) arr[i] = 0;
function walkIn(arr) {
for (var key in arr) arr[key]++;
}
function walkLength(arr) {
for (var i = 0; i < arr.length; i++) arr[i]++;
}
function bench(f) {
var date = new Date();
for (var i = 0; i < 1000; i++) f(arr);
return new Date() - date;
}
// bench Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑеÑÑа запÑÑÑим много Ñаз, ÑеÑедÑÑ
var timeIn = 0,
timeLength = 0;
for (var i = 0; i < 100; i++) {
timeIn += bench(walkIn);
timeLength += bench(walkLength);
}
alert( 'ÐÑÐµÐ¼Ñ walkIn: ' + timeIn + 'мÑ' );
alert( 'ÐÑÐµÐ¼Ñ walkLength: ' + timeLength + 'мÑ' );
performance.now()Ð ÑовÑеменнÑÑ Ð±ÑаÑзеÑÐ°Ñ (кÑоме IE9-) вÑзов performance.now() возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво миллиÑекÑнд, пÑоÑедÑее Ñ Ð½Ð°Ñала загÑÑзки ÑÑÑаниÑÑ. ÐÑиÑÑм именно Ñ Ñамого наÑала, до Ñого, как загÑÑзилÑÑ HTML-Ñайл, еÑли ÑоÑнее â Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа вÑгÑÑзки пÑедÑдÑÑей ÑÑÑаниÑÑ Ð¸Ð· памÑÑи.
Так ÑÑо ÑÑо вÑÐµÐ¼Ñ Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ Ð²ÑÑ, вклÑÑÐ°Ñ Ð½Ð°ÑалÑное обÑаÑение к ÑеÑвеÑÑ.
Ðго можно поÑмоÑÑеÑÑ Ð² лÑбом меÑÑе ÑÑÑаниÑÑ, даже в <head>, ÑÑÐ¾Ð±Ñ ÑзнаÑÑ, ÑколÑко вÑемени поÑÑебовалоÑÑ Ð±ÑаÑзеÑÑ, ÑÑÐ¾Ð±Ñ Ð´Ð¾ него добÑаÑÑÑÑ, вклÑÑÐ°Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÑ HTML.
ÐозвÑаÑаемое знаÑение измеÑÑеÑÑÑ Ð² миллиÑекÑÐ½Ð´Ð°Ñ , но дополниÑелÑно Ð¸Ð¼ÐµÐµÑ ÑоÑноÑÑÑ 3 знака поÑле запÑÑой (до миллионнÑÑ Ð´Ð¾Ð»ÐµÐ¹ ÑекÑндÑ!), поÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ ÐµÐ³Ð¾ и Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ ÑоÑного бенÑмаÑкинга в Ñом ÑиÑле.
console.time(меÑка) и console.timeEnd(меÑка)ÐÐ»Ñ Ð¸Ð·Ð¼ÐµÑÐµÐ½Ð¸Ñ Ñ Ð¾Ð´Ð½Ð¾Ð²ÑеменнÑм вÑводом ÑезÑлÑÑаÑов в конÑоли еÑÑÑ Ð¼ÐµÑодÑ:
console.time(меÑка)â вклÑÑиÑÑ Ð²Ð½ÑÑÑенний Ñ ÑономеÑÑ Ð±ÑаÑзеÑа Ñ Ð¼ÐµÑкой.console.timeEnd(меÑка)â вÑклÑÑиÑÑ Ð²Ð½ÑÑÑенний Ñ ÑономеÑÑ Ð±ÑаÑзеÑа Ñ Ð¼ÐµÑкой и вÑвеÑÑи ÑезÑлÑÑаÑ.
ÐаÑамеÑÑ "меÑка" иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑии ÑаймеÑа, ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло делаÑÑ Ð¼Ð½Ð¾Ð³Ð¾ замеÑов одновÑеменно и даже вкладÑваÑÑ Ð¸Ð·Ð¼ÐµÑÐµÐ½Ð¸Ñ Ð´ÑÑг в дÑÑга.
Ркоде ниже ÑаймеÑÑ walkIn, walkLength â конкÑеÑнÑе ÑеÑÑÑ, а ÑÐ°Ð¹Ð¼ÐµÑ Â«All Benchmarks» â вÑÐµÐ¼Ñ Â«Ð½Ð° вÑÑ Ð¿Ñо вÑÑ»:
var arr = [];
for (var i = 0; i < 1000; i++) arr[i] = 0;
function walkIn(arr) {
for (var key in arr) arr[key]++;
}
function walkLength(arr) {
for (var i = 0; i < arr.length; i++) arr[i]++;
}
function bench(f) {
for (var i = 0; i < 10000; i++) f(arr);
}
console.time("All Benchmarks");
console.time("walkIn");
bench(walkIn);
console.timeEnd("walkIn");
console.time("walkLength");
bench(walkLength);
console.timeEnd("walkLength");
console.timeEnd("All Benchmarks");
ÐÑи запÑÑке ÑÑого пÑимеÑа нÑжно оÑкÑÑÑÑ ÐºÐ¾Ð½ÑолÑ, инаÑе Ð²Ñ Ð½Ð¸Ñего не ÑвидиÑе.
СовÑеменнÑе инÑеÑпÑеÑаÑоÑÑ JavaScript делаÑÑ Ð¼Ð°ÑÑÑ Ð¾Ð¿ÑимизаÑий, напÑимеÑ:
- ÐвÑомаÑиÑеÑки вÑноÑÑÑ Ð¸Ð½Ð²Ð°ÑианÑ, Ñо еÑÑÑ Ð¿Ð¾ÑÑоÑнное в Ñикле знаÑение Ñипа
arr.length, за пÑÐµÐ´ÐµÐ»Ñ Ñикла. - СÑаÑаÑÑÑÑ Ð¿Ð¾Ð½ÑÑÑ, знаÑÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾ Ñипа Ñ ÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ð°Ñ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¸Ð»Ð¸ маÑÑив, какÑÑ ÑÑÑÑкÑÑÑÑ Ð¸Ð¼ÐµÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¸, иÑÑ Ð¾Ð´Ñ Ð¸Ð· ÑÑого, опÑимизиÑоваÑÑ Ð²Ð½ÑÑÑенние алгоÑиÑмÑ.
- ÐÑполнÑÑÑ Ð¿ÑоÑÑейÑие опеÑаÑии, напÑÐ¸Ð¼ÐµÑ Ñложение Ñвно заданнÑÑ ÑиÑел и ÑÑÑок, на ÑÑапе компилÑÑии.
- ÐогÑÑ Ð¾Ð±Ð½Ð°ÑÑжиÑÑ, ÑÑо некий код, напÑÐ¸Ð¼ÐµÑ Ð¿ÑиÑваивание к неиÑполÑзÑемой локалÑной пеÑеменной, ни на ÑÑо не влиÑÐµÑ Ð¸ вообÑе иÑклÑÑиÑÑ ÐµÐ³Ð¾ из вÑполнениÑ, Ñ Ð¾ÑÑ Ð´ÐµÐ»Ð°ÑÑ ÑÑо Ñедко.
ÐÑи опÑимизаÑии могÑÑ Ð²Ð»Ð¸ÑÑÑ Ð½Ð° ÑезÑлÑÑаÑÑ ÑеÑÑов, поÑÑÐ¾Ð¼Ñ Ð¸Ð·Ð¼ÐµÑÑÑÑ ÑкоÑоÑÑÑ Ð±Ð°Ð·Ð¾Ð²ÑÑ Ð¾Ð¿ÐµÑаÑий JavaScript («пÑоводиÑÑ Ð¼Ð¸ÐºÑобенÑмаÑкинг») до Ñого, как Ð²Ñ Ð¸Ð·ÑÑиÑе внÑÑÑенноÑÑи JavaScript-инÑеÑпÑеÑаÑоÑов и поймÑÑе, ÑÑо они ÑеалÑно делаÑÑ Ð½Ð° Ñаком коде, не ÑекомендÑеÑÑÑ.
ФоÑмаÑиÑование и вÑвод даÑ
Ðо вÑÐµÑ Ð±ÑаÑзеÑÐ°Ñ , кÑоме IE10-, поддеÑживаеÑÑÑ Ð½Ð¾Ð²Ñй ÑÑандаÑÑ Ecma 402, коÑоÑÑй добавлÑÐµÑ ÑпеÑиалÑнÑе меÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑоÑмаÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ñ.
ÐÑо делаеÑÑÑ Ð²Ñзовом date.toLocaleString(локалÑ, опÑии), в коÑоÑом можно задаÑÑ Ð¼Ð½Ð¾Ð³Ð¾ наÑÑÑоек. Ðн позволÑÐµÑ ÑказаÑÑ, какие паÑамеÑÑÑ Ð´Ð°ÑÑ Ð½Ñжно вÑвеÑÑи, и ÑÑд наÑÑÑоек вÑвода, поÑле Ñего инÑеÑпÑеÑаÑÐ¾Ñ Ñам ÑÑоÑмиÑÑÐµÑ ÑÑÑокÑ.
ÐÑÐ¸Ð¼ÐµÑ Ñ Ð¿Ð¾ÑÑи вÑеми паÑамеÑÑами даÑÑ Ð¸ ÑÑÑÑким, заÑем английÑким (СШÐ) ÑоÑмаÑиÑованием:
var date = new Date(2014, 11, 31, 12, 30, 0);
var options = {
era: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
weekday: 'long',
timezone: 'UTC',
hour: 'numeric',
minute: 'numeric',
second: 'numeric'
};
alert( date.toLocaleString("ru", options) ); // ÑÑеда, 31 декабÑÑ 2014 г. н.Ñ. 12:30:00
alert( date.toLocaleString("en-US", options) ); // Wednesday, December 31, 2014 Anno Domini 12:30:00 PM
ÐÑ ÑможеÑе подÑобно ÑзнаÑÑ Ð¾ Ð½Ð¸Ñ Ð² ÑÑаÑÑе Intl: инÑеÑнаÑионализаÑÐ¸Ñ Ð² JavaScript, коÑоÑÐ°Ñ Ð¿Ð¾ÑвÑÑена ÑÑÐ¾Ð¼Ñ ÑÑандаÑÑÑ.
ÐеÑÐ¾Ð´Ñ Ð²Ñвода без локализаÑии:
toString(), toDateString(), toTimeString()
ÐозвÑаÑаÑÑ ÑÑандаÑÑное ÑÑÑоÑное пÑедÑÑавление, не заданное жÑÑÑко в ÑÑандаÑÑе, а завиÑÑÑее Ð¾Ñ Ð±ÑаÑзеÑа. ÐдинÑÑвенное ÑÑебование к Ð½ÐµÐ¼Ñ â ÑиÑаемоÑÑÑ Ñеловеком. ÐеÑод toString возвÑаÑÐ°ÐµÑ Ð´Ð°ÑÑ Ñеликом, toDateString() и toTimeString() â ÑолÑко даÑÑ Ð¸ вÑÐµÐ¼Ñ ÑооÑвеÑÑÑвенно.
var d = new Date();
alert( d.toString() ); // вÑвод, поÑ
ожий на 'Wed Jan 26 2011 16:40:50 GMT+0300'
toUTCString()
То же Ñамое, ÑÑо toString(), но даÑа в зоне UTC.
toISOString()
ÐозвÑаÑÐ°ÐµÑ Ð´Ð°ÑÑ Ð² ÑоÑмаÑе ISO ÐеÑали ÑоÑмаÑа бÑдÑÑ Ð´Ð°Ð»ÐµÐµ. ÐоддеÑживаеÑÑÑ ÑовÑеменнÑми бÑаÑзеÑами, не поддеÑживаеÑÑÑ IE8-.
var d = new Date();
alert( d.toISOString() ); // вÑвод, поÑ
ожий на '2011-01-26T13:51:50.417Z'
ÐÑли Ñ Ð¾ÑеÑÑÑ Ð¸Ð¼ÐµÑÑ Ð±Ð¾Ð»ÑÑÑÑ Ð³Ð¸Ð±ÐºÐ¾ÑÑÑ Ð¸ кÑоÑÑ-бÑаÑзеÑноÑÑÑ, Ñо Ñакже можно воÑполÑзоваÑÑÑÑ ÑпеÑиалÑной библиоÑекой, напÑÐ¸Ð¼ÐµÑ Moment.JS или напиÑаÑÑ ÑÐ²Ð¾Ñ ÑÑнкÑÐ¸Ñ ÑоÑмаÑиÑованиÑ.
Ð Ð°Ð·Ð±Ð¾Ñ ÑÑÑоки, Date.parse
ÐÑе ÑовÑеменнÑе бÑаÑзеÑÑ, вклÑÑÐ°Ñ IE9+, понимаÑÑ Ð´Ð°ÑÑ Ð² ÑпÑоÑÑнном ÑоÑмаÑе ISO 8601 Extended.
ÐÑÐ¾Ñ ÑоÑÐ¼Ð°Ñ Ð²ÑглÑÐ´Ð¸Ñ Ñак: YYYY-MM-DDTHH:mm:ss.sssZ, где:
YYYY-MM-DDâ даÑа в ÑоÑмаÑе год-меÑÑÑ-денÑ.- ÐбÑÑнÑй Ñимвол
TиÑполÑзÑеÑÑÑ ÐºÐ°Ðº ÑазделиÑелÑ. HH:mm:ss.sssâ вÑемÑ: ÑаÑÑ-минÑÑÑ-ÑекÑндÑ-миллиÑекÑндÑ.- ЧаÑÑÑ
'Z'обознаÑÐ°ÐµÑ Ð²ÑеменнÑÑ Ð·Ð¾Ð½Ñ â в ÑоÑмаÑе+-hh:mm, либо ÑимволZ, обознаÑаÑÑий UTC. Ðо ÑÑандаÑÑÑ ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ не ÑказÑваÑÑ, Ñогда UTC, но в Safari Ñ ÑÑим оÑибка, Ñак ÑÑо лÑÑÑе ÑказÑваÑÑ Ð²Ñегда.
Также Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑкоÑоÑеннÑе ваÑианÑÑ, напÑÐ¸Ð¼ÐµÑ YYYY-MM-DD или YYYY-MM или даже ÑолÑко YYYY.
ÐеÑод Date.parse(str) ÑазбиÑÐ°ÐµÑ ÑÑÑÐ¾ÐºÑ str в Ñаком ÑоÑмаÑе и возвÑаÑÐ°ÐµÑ ÑооÑвеÑÑÑвÑÑÑее ей колиÑеÑÑво миллиÑекÑнд. ÐÑли ÑÑо невозможно, Date.parse возвÑаÑÐ°ÐµÑ NaN.
ÐапÑимеÑ:
var msUTC = Date.parse('2012-01-26T13:51:50.417Z'); // зона UTC
alert( msUTC ); // 1327571510417 (ÑиÑло миллиÑекÑнд)
С Ñаймзоной -07:00 GMT:
var ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert( ms ); // 1327611110417 (ÑиÑло миллиÑекÑнд)
Ðо поÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑпеÑиÑикаÑии ECMAScript 5 ÑоÑÐ¼Ð°Ñ Ð½Ðµ бÑл ÑÑандаÑÑизован, и бÑаÑзеÑÑ, вклÑÑÐ°Ñ IE8-, имели Ñвои ÑобÑÑвеннÑе ÑоÑмаÑÑ Ð´Ð°Ñ. ЧаÑÑиÑно, ÑÑи ÑоÑмаÑÑ Ð¿ÐµÑеÑекаÑÑÑÑ.
ÐапÑимеÑ, код ниже ÑабоÑÐ°ÐµÑ Ð²ÐµÐ·Ð´Ðµ, вклÑÑÐ°Ñ ÑÑаÑÑе IE:
var ms = Date.parse("January 26, 2011 13:51:50");
alert( ms );
ÐÑ Ñакже можеÑе поÑиÑаÑÑ Ð¾ ÑÑаÑÑÑ ÑоÑмаÑÐ°Ñ IE в докÑменÑаÑии к меÑÐ¾Ð´Ñ MSDN Date.parse.
ÐонеÑно же, ÑейÑÐ°Ñ Ð»ÑÑÑе иÑполÑзоваÑÑ ÑовÑеменнÑй ÑоÑмаÑ. ÐÑли же нÑжна поддеÑжка IE8-, Ñо меÑод Date.parse, как и ÑÑд дÑÑгиÑ
ÑовÑеменнÑÑ
меÑодов, добавлÑеÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñекой es5-shim.
ÐеÑод Date.now()
ÐеÑод Date.now() возвÑаÑÐ°ÐµÑ Ð´Ð°ÑÑ ÑÑÐ°Ð·Ñ Ð² виде миллиÑекÑнд.
ТеÑ
ниÑеÑки, он аналогиÑен вÑÐ·Ð¾Ð²Ñ +new Date(), но в оÑлиÑие Ð¾Ñ Ð½ÐµÐ³Ð¾ не ÑоздаÑÑ Ð¿ÑомежÑÑоÑнÑй обÑÐµÐºÑ Ð´Ð°ÑÑ, а поÑÑÐ¾Ð¼Ñ â во много Ñаз бÑÑÑÑее.
Ðго иÑполÑзование оÑобенно ÑекомендÑеÑÑÑ Ñам, где пÑоизводиÑелÑноÑÑÑ Ð¿Ñи ÑабоÑе Ñ Ð´Ð°Ñами кÑиÑиÑна. ÐбÑÑно ÑÑо не на веб-ÑÑÑаниÑÐ°Ñ , а, к пÑимеÑÑ, в ÑазÑабоÑке Ð¸Ð³Ñ Ð½Ð° JavaScript.
ÐÑого
- ÐаÑа и вÑÐµÐ¼Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² JavaScript одним обÑекÑом: Date. СоздаÑÑ Â«ÑолÑко вÑемÑ» пÑи ÑÑом нелÑзÑ, оно должно бÑÑÑ Ñ Ð´Ð°Ñой. СпиÑок меÑодов
DateÐ²Ñ Ð¼Ð¾Ð¶ÐµÑе найÑи в ÑпÑавоÑнике Date или вÑÑе. - ÐÑÑÑÑÑ Ð¼ÐµÑÑÑев наÑинаеÑÑÑ Ñ Ð½ÑлÑ.
- ÐÑÑÑÑÑ Ð´Ð½ÐµÐ¹ недели (длÑ
getDay()) Ñоже наÑинаеÑÑÑ Ñ Ð½ÑÐ»Ñ (и ÑÑо воÑкÑеÑенÑе). - ÐбÑекÑ
DateÑдобен Ñем, ÑÑо авÑокоÑÑекÑиÑÑеÑÑÑ. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð»ÐµÐ³ÐºÐ¾ ÑдвигаÑÑ Ð´Ð°ÑÑ. - ÐÑи пÑеобÑазовании к ÑиÑÐ»Ñ Ð¾Ð±ÑекÑ
DateдаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво миллиÑекÑнд, пÑоÑедÑÐ¸Ñ Ñ 1 ÑнваÑÑ 1970 UTC. ÐобоÑное ÑледÑÑвие â даÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑÑиÑаÑÑ, ÑезÑлÑÑаÑом бÑÐ´ÐµÑ ÑазниÑа в миллиÑекÑÐ½Ð´Ð°Ñ . - ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑекÑÑей даÑÑ Ð² миллиÑекÑндаÑ
лÑÑÑе иÑполÑзоваÑÑ
Date.now(), ÑÑÐ¾Ð±Ñ Ð½Ðµ ÑоздаваÑÑ Ð»Ð¸Ñний обÑекÑDate(кÑоме IE8-) - ÐÐ»Ñ Ð±ÐµÐ½ÑмаÑкинга лÑÑÑе иÑполÑзоваÑÑ
performance.now()(кÑоме IE9-), он в 1000 Ñаз ÑоÑнее.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)