ÐоÑÐµÐ¼Ñ Ð¿Ð¾Ð²ÑоÑное введение? ÐоÑÐ¾Ð¼Ñ ÑÑо JavaScript извеÑÑен Ñем, ÑÑо ÑвлÑеÑÑÑ ÑамÑм непÑавилÑно понÑÑÑм ÑзÑком пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² миÑе. Ðго ÑаÑÑо назÑваÑÑ Ð¸Ð³ÑÑÑкой, но под Ñлоем обманÑивой пÑоÑÑоÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¼Ð¾ÑнÑе ÑзÑковÑе возможноÑÑи. РнаÑÑоÑÑее вÑÐµÐ¼Ñ JavaScript иÑполÑзÑеÑÑÑ Ð½ÐµÐ²ÐµÑоÑÑнÑм колиÑеÑÑвом вÑÑококлаÑÑнÑÑ Ð¿Ñиложений, показÑваÑ, ÑÑо ÑглÑблÑнное знание ÑÑой ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ð¸ ÑвлÑеÑÑÑ Ð²Ð°Ð¶Ð½Ñм навÑком Ð´Ð»Ñ Ð»Ñбого веб или мобилÑного ÑазÑабоÑÑика.
ÐÑло Ð±Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ наÑаÑÑ Ñ Ð¸ÑÑоÑии ÑзÑка. JavaScript бÑл Ñоздан в 1995 ÐÑенданом Ðйком, инженеÑом в компании Netscape. ÐеÑвÑй Ñелиз ÑоÑÑоÑлÑÑ Ð²Ð¼ÐµÑÑе Ñ Ð²ÑÑ Ð¾Ð´Ð¾Ð¼ бÑаÑзеÑа Netscape 2 в наÑале 1996 года. СнаÑала ÑзÑк назÑвалÑÑ LiveScript, но заÑем бÑл пеÑеименован в ÑвÑзи Ñ Ð¼Ð°ÑкеÑинговÑми ÑелÑми, ÑÑÐ¾Ð±Ñ ÑÑгÑаÑÑ Ð½Ð° попÑлÑÑноÑÑи ÑзÑка Java компании Sun Microsystem â неÑмоÑÑÑ Ð½Ð° ÑÑо ÑзÑки пÑакÑиÑеÑки не имеÑÑ Ð½Ð¸Ñего обÑего дÑÑг Ñ Ð´ÑÑгом. Так бÑло положено наÑало пÑÑаниÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑÑими ÑзÑками.
ЧÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ Microsoft вÑпÑÑÑила оÑÐµÐ½Ñ Ð¿Ð¾Ñ Ð¾Ð¶Ð¸Ð¹ и пÑакÑиÑеÑки ÑовмеÑÑимÑй ÑзÑк JScript, коÑоÑÑй ÑÑл вмеÑÑе Ñ IE3. ЧеÑез паÑÑ Ð¼ÐµÑÑÑев Netscape оÑпÑавил ÑзÑк в Ecma International, ÐвÑопейÑкÑÑ Ð¾ÑганизаÑÐ¸Ñ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑÑÑÑÑ ÑÑандаÑÑами, коÑоÑÐ°Ñ Ð²ÑпÑÑÑила пеÑвÑÑ Ð²ÐµÑÑÐ¸Ñ ÑÑандаÑÑа ECMAScript в 1997. СÑандаÑÑ Ð¿Ð¾Ð»ÑÑил знаÑимое обновление в ECMAScript edition 3 в 1999, и оÑÑаÑÑÑÑ ÑамÑм ÑÑабилÑнÑм до ÑегоднÑÑнего днÑ. ЧеÑвÑÑÑÐ°Ñ Ð²ÐµÑÑÐ¸Ñ Ð±Ñла оÑклонена, из-за пÑоблем Ñ ÑÑложнениÑми в ÑзÑке. Ðногие веÑи из ÑеÑвÑÑÑого Ð¸Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑлÑжили оÑновой Ð´Ð»Ñ ÑÑандаÑÑа ECMAScript 5 (декабÑÑ 2009) и ECMAScript 6 (иÑÐ½Ñ 2015).
РоÑлиÑие Ð¾Ñ Ð±Ð¾Ð»ÑÑинÑÑва ÑзÑков, JavaScript не ÑледÑÐµÑ ÐºÐ¾Ð½ÑепÑии ввода (input) и вÑвода (output). Ðн ÑпÑоекÑиÑован Ñаким обÑазом, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÑкаÑÑÑÑ ÐºÐ°Ðº ÑзÑк ÑÑенаÑиев, вÑÑÑоеннÑй в ÑÑÐµÐ´Ñ Ð¸ÑполнениÑ. Ð¡Ð°Ð¼Ð°Ñ Ð¿Ð¾Ð¿ÑлÑÑÐ½Ð°Ñ ÑÑеда иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑо бÑаÑзеÑ, однако инÑеÑпÑеÑаÑоÑÑ JavaScript пÑиÑÑÑÑÑвÑÑÑ Ð¸ в Adobe Acrobat, Photoshop, Yahoo!'s Widget engine, и даже в ÑеÑвеÑном окÑÑжении, напÑÐ¸Ð¼ÐµÑ node.js.
ÐпиÑаниеJavaScript ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑно-оÑиенÑиÑованнÑм ÑзÑком, имеÑÑий ÑÐ¸Ð¿Ñ Ð¸ опеÑаÑоÑÑ, вÑÑÑоеннÑе обÑекÑÑ Ð¸ меÑодÑ. Ðго ÑинÑакÑÐ¸Ñ Ð¿ÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¾Ñ ÑзÑков Java и C, поÑÑÐ¾Ð¼Ñ Ð¼Ð½Ð¾Ð³Ð¾ конÑÑÑÑкÑий из ÑÑиÑ
ÑзÑков пÑÐ¸Ð¼ÐµÐ½Ð¸Ð¼Ñ Ð¸ к JavaScript. Ðдним из клÑÑевÑÑ
оÑлиÑий JavaScript ÑвлÑеÑÑÑ Ð¾ÑÑÑÑÑÑвие клаÑÑов, вмеÑÑо ÑÑого ÑÑнкÑионалÑноÑÑÑ ÐºÐ»Ð°ÑÑов оÑÑÑеÑÑвлÑеÑÑÑ Ð¿ÑоÑоÑипами обÑекÑов (ÑмоÑÑиÑе ES6 Classes
) . ÐÑÑгое главное оÑлиÑие в Ñом, ÑÑо ÑÑнкÑии ÑÑо обÑекÑÑ, в коÑоÑÑÑ
ÑодеÑжиÑÑÑ Ð¸ÑполнÑемÑй код и коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð¿ÐµÑÐµÐ´Ð°Ð½Ñ ÐºÑда-либо, как и лÑбой дÑÑгой обÑекÑ.
ÐаÑнÑм Ñ Ð¾ÑÐ½Ð¾Ð²Ñ Ð»Ñбого ÑзÑка: Ñ Ñипов даннÑÑ . ÐÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° JavaScript опеÑиÑÑÑÑ Ð·Ð½Ð°ÑениÑми, и вÑе ÑÑи знаÑÐµÐ½Ð¸Ñ Ð¿ÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ Ðº опÑеделÑÐ½Ð½Ð¾Ð¼Ñ ÑипÑ. Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² JavaScript:
Ðа, еÑÑ Undefined и Null, коÑоÑÑе немного обоÑобленÑ. Ð ÐаÑÑивÑ, коÑоÑÑе ÑвлÑÑÑÑÑ Ð¾ÑобÑм видом обÑекÑов. Ð Ñакже ÐаÑÑ Ð¸ РегÑлÑÑнÑе вÑÑажениÑ, Ñоже ÑвлÑÑÑиеÑÑ Ð¾Ð±ÑекÑами. Ð, еÑли бÑÑÑ ÑÐµÑ Ð½Ð¸ÑеÑки ÑоÑнÑм, ÑÑнкÑии ÑÑо Ñоже оÑобÑй вид обÑекÑа. ÐоÑÑÐ¾Ð¼Ñ ÑÑ ÐµÐ¼Ð° Ñипов вÑглÑÐ´Ð¸Ñ ÑкоÑее Ñак:
Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ (новÑй Ñип из ÑеÑÑой ÑедакÑии)
Также еÑÑÑ Ð½ÐµÑколÑко вÑÑÑоеннÑÑ Ñипов ÐÑибок. ЧÑÐ¾Ð±Ñ Ð±Ñло пÑоÑе, ÑаÑÑмоÑÑим подÑобнее пеÑвÑÑ ÑÑ ÐµÐ¼Ñ.
ЧиÑлаЧиÑла в JavaScript â ÑÑо "64-биÑнÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð¹ ÑоÑноÑÑи ÑоÑмаÑа IEEE 754", ÑоглаÑно ÑпеÑиÑикаÑии. ÐÑо Ð¸Ð¼ÐµÐµÑ Ð¸Ð½ÑеÑеÑнÑе поÑледÑÑвиÑ. Ð JavaScript Ð½ÐµÑ Ñакой веÑи, как Ñелое ÑиÑло, поÑÑÐ¾Ð¼Ñ Ñ Ð°ÑиÑмеÑикой нÑжно бÑÑÑ Ð½Ð°ÑекÑ, еÑли Ð²Ñ Ð¿ÑивÑкли к вÑÑиÑлениÑм в ÑзÑÐºÐ°Ñ C или Java. ÐзглÑниÑе на пÑимеÑ:
0.1 + 0.2 == 0.30000000000000004;
Ðа пÑакÑике ÑелÑе знаÑÐµÐ½Ð¸Ñ ÑÑо 32-биÑнÑе ÑелÑе (и Ñ ÑанÑÑÑÑ Ñаким обÑазом в некоÑоÑÑÑ Ð±ÑаÑзеÑнÑÑ ÑеализаÑиÑÑ ), ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð°Ð¶Ð½Ð¾ Ð´Ð»Ñ Ð¿Ð¾Ð±Ð¸ÑовÑÑ Ð¾Ð¿ÐµÑаÑий.
ÐоддеÑживаÑÑÑÑ ÑÑандаÑÑнÑе аÑиÑмеÑиÑеÑкие опеÑаÑоÑÑ, вклÑÑÐ°Ñ Ñложение, вÑÑиÑание, оÑÑаÑок Ð¾Ñ Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸ Ñ.д. ÐÑÑÑ ÐµÑÑ Ð²ÑÑÑоеннÑй обÑекÑ, коÑоÑÑй Ñ Ð·Ð°Ð±Ñл ÑпомÑнÑÑÑ, назÑваемÑй Math, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ пÑодвинÑÑÑе маÑемаÑиÑеÑкие ÑÑнкÑии и конÑÑанÑÑ:
Math.sin(3.5);
var circumference = Math.PI * (r + r);
ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑеобÑазоваÑÑ ÑÑÑÐ¾ÐºÑ Ð² Ñелое ÑиÑло, иÑполÑзÑÑ Ð²ÑÑÑоеннÑÑ ÑÑнкÑÐ¸Ñ parseInt()
. ÐÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑй вÑоÑой паÑамеÑÑ â оÑнование ÑиÑÑÐµÐ¼Ñ ÑÑиÑлениÑ, коÑоÑое ÑледÑÐµÑ Ð²Ñегда Ñвно ÑказÑваÑÑ:
parseInt("123", 10); // 123
parseInt("010", 10); // 10
ÐÑли Ð²Ñ Ð½Ðµ пÑедоÑÑавиÑе оÑнование, Ñо можеÑе полÑÑиÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñе ÑезÑлÑÑаÑÑ:
parseInt("010"); // 8
parseInt("0x10"); // 16
ÐÑо ÑлÑÑилоÑÑ Ð¿Ð¾ÑомÑ, ÑÑо ÑÑнкÑÐ¸Ñ parseInt()
ÑаÑÑенила ÑÑÑÐ¾ÐºÑ ÐºÐ°Ðº воÑÑмеÑиÑнÑÑ Ð¸Ð·-за наÑалÑного 0, а ÑеÑÑнадÑаÑеÑиÑнÑÑ - из-за наÑалÑного "0x".
ÐÑли Ñ Ð¾ÑиÑе пÑеобÑазоваÑÑ Ð´Ð²Ð¾Ð¸Ñное ÑиÑло в деÑÑÑиÑное Ñелое, пÑоÑÑо ÑмениÑе оÑнование:
ÐÑ Ð¼Ð¾Ð¶ÐµÑе аналогиÑно паÑÑиÑÑ Ð´ÑобнÑе ÑиÑла, иÑполÑзÑÑ Ð²ÑÑÑоеннÑÑ ÑÑнкÑÐ¸Ñ parseFloat()
, коÑоÑÐ°Ñ Ð¸ÑполÑзÑÐµÑ Ð²Ñегда оÑнование 10 в оÑлиÑие Ð¾Ñ ÑодÑÑвенной parseInt()
.
Также можно иÑполÑзоваÑÑ ÑнаÑнÑй опеÑаÑÐ¾Ñ +
Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² ÑиÑло:
+"42"; // 42
+"0x10"; // 16
СпеÑиалÑное знаÑение NaN (ÑокÑаÑение Ð¾Ñ "Not a Number") возвÑаÑаеÑÑÑ, еÑли ÑÑÑока не ÑвлÑеÑÑÑ ÑиÑлом:
parseInt("hello", 10); // NaN
NaN
"заÑазиÑелен": лÑÐ±Ð°Ñ Ð¼Ð°ÑемаÑиÑеÑÐºÐ°Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð½Ð°Ð´ NaN
возвÑаÑÐ°ÐµÑ NaN
:
ÐÑовеÑиÑÑ Ð·Ð½Ð°Ñение на NaN
можно вÑÑÑоенной ÑÑнкÑией isNaN()
:
JavaScript Ñакже Ð¸Ð¼ÐµÐµÑ ÑпеÑиалÑнÑе знаÑÐµÐ½Ð¸Ñ Infinity
(беÑконеÑноÑÑÑ) и -Infinity
:
1 / 0; // Infinity
-1 / 0; // -Infinity
ÐÑовеÑиÑÑ Ð·Ð½Ð°Ñение на Infinity
, -Infinity
и NaN
можно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð²ÑÑÑоенной ÑÑнкÑии isFinite()
:
isFinite(1 / 0); // false
isFinite(-Infinity); // false
isFinite(NaN); // false
СÑÑоки
СÑÑоки в JavaScript - ÑÑо поÑледоваÑелÑноÑÑи Ñимволов Unicode (в кодиÑовке UTF-16). ÐÐ»Ñ ÑÐµÑ , кÑо Ð¸Ð¼ÐµÐµÑ Ð´ÐµÐ»Ð¾ Ñ Ð¸Ð½ÑеÑнаÑионализаÑией, ÑÑо должно ÑÑаÑÑ Ñ Ð¾ÑоÑей новоÑÑÑÑ. ÐÑли бÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑоÑнÑм, Ñо ÑÑÑока - ÑÑо поÑледоваÑелÑноÑÑÑ ÐºÐ¾Ð´Ð¾Ð²ÑÑ ÐµÐ´Ð¸Ð½Ð¸Ñ, ÐºÐ°Ð¶Ð´Ð°Ñ Ð¸Ð· коÑоÑÑÑ Ð¿ÑедÑÑавлена 16-биÑовÑм ÑиÑлом, а каждÑй Ñимвол Unicode ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· 1 или 2 кодовÑÑ ÐµÐ´Ð¸Ð½Ð¸Ñ.
ЧÑÐ¾Ð±Ñ Ð¿ÑедÑÑавиÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑй Ñимвол, иÑполÑзÑйÑе ÑÑÑокÑ, ÑодеÑжаÑÑÑ ÑолÑко ÑÑÐ¾Ñ Ñимвол.
ЧÑÐ¾Ð±Ñ Ð²ÑÑÑниÑÑ Ð´Ð»Ð¸Ð½Ñ ÑÑÑоки (в кодовÑÑ
единиÑаÑ
), иÑполÑзÑйÑе ÑвойÑÑво length
:
ÐÑо Ñже пеÑвÑй Ñаг Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¾Ð±ÑекÑами! ÐÑ Ñже говоÑили, ÑÑо и ÑÑÑоки можно иÑполÑзоваÑÑ ÐºÐ°Ðº обÑекÑÑ? У Ð½Ð¸Ñ Ñоже еÑÑÑ Ð¼ÐµÑодÑ:
"hello".charAt(0); // h
"hello, world".replace("hello", "goodbye"); // goodbye, world
"hello".toUpperCase(); // HELLO
ÐÑÑгие ÑипÑ
JavaScript дополниÑелÑно ÑазлиÑÐ°ÐµÑ Ñакие ÑипÑ, как null
, коÑоÑÑй ÑказÑÐ²Ð°ÐµÑ Ð½Ð° пÑеднамеÑенное оÑÑÑÑÑÑвÑÑÑее знаÑение, и undefined
, ÑказÑваÑÑий на неиниÑиализиÑованное знаÑение â Ñо еÑÑÑ, знаÑение, коÑоÑое даже не бÑло назнаÑено. ÐÑ Ð¿Ð¾Ð³Ð¾Ð²Ð¾Ñим о пеÑеменнÑÑ
позже, но в JavaScript можно обÑÑвиÑÑ Ð¿ÐµÑеменнÑÑ Ð±ÐµÐ· пÑиÑÐ²Ð¾ÐµÐ½Ð¸Ñ ÐµÐ¹ знаÑениÑ. Ð ÑÑом ÑлÑÑае Ñип пеÑеменной бÑÐ´ÐµÑ "undefined"
.
ÐÑÑ Ð² JavaScript еÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкий (бÑлевÑй) Ñип даннÑÑ , коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð´Ð²Ð° возможнÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ true или false (оба ÑвлÑÑÑÑÑ ÐºÐ»ÑÑевÑми Ñловами). ÐÑбое знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑеобÑазовано в логиÑеÑкое знаÑение в ÑооÑвеÑÑÑвии Ñо ÑледÑÑÑими пÑавилами:
false
, 0
, пÑÑÑÐ°Ñ ÑÑÑока (""
), NaN
, null
и undefined
пÑеобÑазÑÑÑÑÑ Ð² false.
true.
ÐÑеобÑазование знаÑений можно оÑÑÑеÑÑвиÑÑ Ñвно, иÑполÑзÑÑ ÑÑнкÑÐ¸Ñ Boolean()
:
Boolean(""); // false
Boolean(234); // true
ÐÑÐ¾Ñ Ð¼ÐµÑод иÑполÑзÑеÑÑÑ Ñедко, Ñак как JavaScript Ð¼Ð¾Ð¶ÐµÑ Ð°Ð²ÑомаÑиÑеÑки пÑеобÑазовÑваÑÑ ÑÐ¸Ð¿Ñ Ð² ÑеÑ
ÑлÑÑаÑÑ
, когда ожидаеÑÑÑ Ð±Ñлевое знаÑение, напÑÐ¸Ð¼ÐµÑ Ð² опеÑаÑоÑе if
. Ðз-за Ñого, ÑÑо лÑбой Ñип даннÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑеобÑазован в бÑлевое знаÑение, иногда говоÑÑÑ, ÑÑо даннÑе "иÑÑиннÑе" или "ложнÑе".
ÐÐ»Ñ Ð¾Ð¿ÐµÑаÑий Ñ Ð»Ð¾Ð³Ð¸ÑеÑкими даннÑми иÑполÑзÑÑÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкие опеÑаÑоÑÑ: &&
(логиÑеÑкое Ð), ||
(логиÑеÑкое ÐÐÐ), !
(логиÑеÑкое ÐÐ).
ÐÐ»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
пеÑеменнÑÑ
в JavaScript иÑполÑзÑÑÑÑÑ ÐºÐ»ÑÑевÑе Ñлова let
, const
или var
.
let a;
let name = "Simon";
let
позволÑÐµÑ Ð¾Ð±ÑÑвлÑÑÑ Ð¿ÐµÑеменнÑе, коÑоÑÑе доÑÑÑÐ¿Ð½Ñ ÑолÑко в блоке, в коÑоÑом они обÑÑвленÑ:
// myLetVariable недоÑÑÑпна здеÑÑ
for (let myLetVariable = 0; myLetVariable < 5; myLetVariable++) {
// myLetVariable доÑÑÑпна ÑолÑко здеÑÑ
}
// myLetVariable недоÑÑÑпна здеÑÑ
const
позволÑÐµÑ ÑоздаваÑÑ Ð¿ÐµÑеменнÑе, ÑÑи знаÑÐµÐ½Ð¸Ñ Ð½Ðµ пÑедполагаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¾ÑÑÑпна из блока, в коÑоÑом она обÑÑвлена.
const Pi = 3.14; // в пеÑеменнÑÑ Pi запиÑано знаÑение.
Pi = 1; // вÑÐ·Ð¾Ð²ÐµÑ Ð¸ÑклÑÑение, Ñак как знаÑение конÑÑанÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ.
var
наиболее обÑее ÑÑедÑÑво обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑеменной. Ðно не Ð¸Ð¼ÐµÐµÑ Ð¾Ð³ÑаниÑений, коÑоÑÑе имеÑÑ Ð´Ð²Ð° вÑÑеопиÑаннÑÑ
ÑпоÑоба. ÐÑо поÑомÑ, ÑÑо ÑÑо бÑл изнаÑалÑно единÑÑвеннÑй ÑпоÑоб обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑеменной в JavaScript. ÐеÑеменнаÑ, обÑÑÐ²Ð»ÐµÐ½Ð½Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ var
, доÑÑÑпна в пÑеделаÑ
ÑÑнкÑии, в коÑоÑой она обÑÑвлена.
var a;
var name = "Simon";
ÐÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð´Ð° Ñ Ð¿ÐµÑеменной, обÑÑвленной Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ var
:
// myVarVariable доÑÑÑпна здеÑÑ
for (var myVarVariable = 0; myVarVariable < 5; myVarVariable++) {
// myVarVariable доÑÑÑпна Ð´Ð»Ñ Ð²Ñей ÑÑнкÑии
}
// myVarVariable доÑÑÑпна и здеÑÑ
ÐÑли Ð²Ñ Ð¾Ð±ÑÑвлÑеÑе пеÑеменнÑÑ Ð±ÐµÐ· пÑиÑÐ²Ð¾ÐµÐ½Ð¸Ñ ÐµÐ¹ какого-либо знаÑениÑ, Ñо ÐµÑ Ñип бÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑн как undefined
.
Ðажной оÑобенноÑÑÑÑ ÑзÑка JavaScript ÑвлÑеÑÑÑ Ñо, ÑÑо блоки даннÑÑ
не имеÑÑ Ñвоей облаÑÑи видимоÑÑи, она еÑÑÑ ÑолÑко Ñ ÑÑнкÑий. ÐоÑÑомÑ, еÑли обÑÑвиÑÑ Ð¿ÐµÑеменнÑÑ ÑеÑез var
в блоке даннÑÑ
(напÑимеÑ, внÑÑÑи конÑÑолиÑÑÑÑей ÑÑÑÑкÑÑÑÑ if
), Ñо она бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпна вÑей ÑÑнкÑии. СледÑÐµÑ Ð¾ÑмеÑиÑÑ, ÑÑо в новом ÑÑандаÑÑе ECMAScript Edition 6 поÑвилиÑÑ Ð¸Ð½ÑÑÑÑкÑии let
и const
, позволÑÑÑие обÑÑвлÑÑÑ Ð¿ÐµÑеменнÑе Ñ Ð¾Ð±Ð»Ð°ÑÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи, огÑаниÑенной пÑеделами блока.
JavaScript поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñакие опеÑаÑоÑÑ, как +
, -
, *
, /
и %
, коÑоÑÑй возвÑаÑÐ°ÐµÑ Ð¾ÑÑаÑок Ð¾Ñ Ð´ÐµÐ»ÐµÐ½Ð¸Ñ (не пÑÑаÑÑ Ñ Ð¼Ð¾Ð´Ñлем). ÐнаÑÐµÐ½Ð¸Ñ Ð¿ÑиÑваиваÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа =
, или Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑоÑÑавнÑÑ
опеÑаÑоÑов +=
и -=
. ÐÑо ÑокÑаÑÑÐ½Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ x = x опеÑаÑÐ¾Ñ y
.
Так же иÑполÑзÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð¸Ð½ÐºÑеменÑа (++
) и декÑеменÑа (--
). ÐоÑоÑÑе имеÑÑ Ð¿ÑеÑикÑнÑÑ Ð¸ поÑÑÑикÑнÑÑ ÑоÑÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи.
ÐпеÑаÑÐ¾Ñ +
Ñак же вÑполнÑÐµÑ ÐºÐ¾Ð½ÐºÐ°ÑенаÑÐ¸Ñ (обÑединение) ÑÑÑок:
"hello" + " world"; // "hello world"
ÐÑи Ñложении ÑÑÑокового и ÑиÑлового знаÑений пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑкое пÑеобÑазование в ÑÑÑокÑ. ÐонаÑÐ°Ð»Ñ Ñакое Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑÑаÑÑ:
"3" + 4 + 5; // "345"
3 + 4 + "5"; // "75"
ÐÐ»Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ðº ÑÑÑоке пÑоÑÑо пÑибавÑÑе к Ð½ÐµÐ¼Ñ Ð¿ÑÑÑÑÑ ÑÑÑокÑ.
ÐÐ»Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð² JavaScript иÑполÑзÑÑÑÑÑ ÑледÑÑÑие опеÑаÑоÑÑ: <
, >
, <=
и >=
. СÑавниваÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ не ÑолÑко ÑиÑла, но и ÑÑÑоки. ÐÑовеÑка на ÑавенÑÑво немного Ñложнее. ÐÐ»Ñ Ð¿ÑовеÑки иÑполÑзÑÑÑ Ð´Ð²Ð¾Ð¹Ð½Ð¾Ð¹ (==
) или ÑÑойной (===
) опеÑаÑÐ¾Ñ Ð¿ÑиÑваиваниÑ. Ðвойной опеÑаÑÐ¾Ñ ==
оÑÑÑеÑÑвлÑÐµÑ Ð°Ð²ÑомаÑиÑеÑкое пÑеобÑазование Ñипов, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиводиÑÑ Ðº инÑеÑеÑнÑм ÑезÑлÑÑаÑам:
123 == "123"; // true
1 == true; // true
ÐÑли пÑеобÑазование нежелаÑелÑно, Ñо иÑполÑзÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑÑÑогого ÑавенÑÑва:
1 === true; // false
123 === "123"; // false
true === true; // true
ÐÐ»Ñ Ð¿ÑовеÑки на неÑавенÑÑво иÑполÑзÑÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ !=
и !==
.
ÐÑделÑного Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ ÑÑоÑÑ Ð¿Ð¾Ð±Ð¸ÑовÑе опеÑаÑоÑÑ, Ñ ÐºÐ¾ÑоÑÑми Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ознакомиÑÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑем Ñазделе.
УпÑавлÑÑÑие ÑÑÑÑкÑÑÑÑУпÑавлÑÑÑие ÑÑÑÑкÑÑÑÑ Ð² JavaScript оÑÐµÐ½Ñ Ð¿Ð¾Ñ
ожи на ÑаковÑе в ÑзÑкаÑ
ÑемейÑÑва C. УÑловнÑе опеÑаÑоÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ñ ÐºÐ»ÑÑевÑми Ñловами if
и else
, коÑоÑÑе можно ÑоÑÑавлÑÑÑ Ð² ÑепоÑки:
var name = "kittens";
if (name == "puppies") {
name += "!";
} else if (name == "kittens") {
name += "!!";
} else {
name = "!" + name;
}
name == "kittens!!";
Ð JavaScript еÑÑÑ ÑÑи Ñипа Ñиклов: while
, do-while
и for
. While иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑного Ñикла, а do-while ÑелеÑообÑазно пÑимениÑÑ Ð² Ñом ÑлÑÑае, еÑли Ð²Ñ Ñ
оÑиÑе, ÑÑÐ¾Ð±Ñ Ñикл бÑл вÑполнен Ñ
оÑÑ Ð±Ñ Ð¾Ð´Ð¸Ð½ Ñаз:
while (true) {
// беÑконеÑнÑй Ñикл!
}
var input;
do {
input = get_input();
} while (inputIsNotValid(input));
Цикл for
поÑ
ож на Ñакой же в ÑзÑкаÑ
C и Java: он позволÑÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ Ð´Ð°Ð½Ð½Ñе Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÐ¾Ð»Ñ Ð·Ð° вÑполнением Ñикла:
for (var i = 0; i < 5; i++) {
// ÐÑполниÑÑÑ 5 Ñаз
}
JavaScript Ñакже ÑодеÑÐ¶Ð¸Ñ Ð´Ð²Ðµ дÑÑгиÑ
извеÑÑнÑÑ
конÑÑÑÑкÑии: for...of
for (let value of array) {
// опеÑаÑии Ñ value
}
и for...in
:
for (let property in object) {
// опеÑаÑии над ÑвойÑÑвами обÑекÑа
}
ÐогиÑеÑкие опеÑаÑоÑÑ &&
и ||
иÑполÑзÑÑÑ "коÑоÑкий Ñикл вÑÑиÑлениÑ", ÑÑо знаÑиÑ, ÑÑо вÑÑиÑление каждого поÑледÑÑÑего опеÑаÑоÑа завиÑÐ¸Ñ Ð¾Ñ Ð¿ÑедÑдÑÑего. ÐапÑимеÑ, полезно пÑовеÑиÑÑ ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ обÑÐµÐºÑ Ð¸Ð»Ð¸ неÑ, пÑежде Ñем пÑÑаÑÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к его ÑвойÑÑвам:
var name = o && o.getName();
Таким ÑпоÑобом Ñдобно задаваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ:
var name = otherName || "default";
Ð ÑÑловнÑм опеÑаÑоÑам в JavaScript пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ñакже ÑеÑнаÑнÑй опеÑаÑÐ¾Ñ "?
" :
var allowed = age > 18 ? "yes" : "no";
ÐпеÑаÑÐ¾Ñ switch
иÑполÑзÑеÑÑÑ Ð¿Ñи необÑ
одимоÑÑи множеÑÑвенного ÑÑавнениÑ:
switch (action) {
case "draw":
drawit();
break;
case "eat":
eatit();
break;
default:
donothing();
}
ÐÑли в конÑе инÑÑÑÑкÑии case
не добавиÑÑ Ð¾ÑÑанавливаÑÑÑÑ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ break
, Ñо вÑполнение пеÑейдÑÑ Ðº ÑледÑÑÑей инÑÑÑÑкÑии case
. Ðак пÑавило, Ñакое поведение нежелаÑелÑно, но еÑли вдÑÑг Ð²Ñ ÑеÑили его иÑполÑзоваÑÑ, наÑÑоÑÑелÑно ÑекомендÑем пиÑаÑÑ ÑооÑвеÑÑÑвÑÑÑий комменÑаÑий Ð´Ð»Ñ Ð¾Ð±Ð»ÐµÐ³ÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¸Ñка оÑибок:
switch (a) {
case 1: // fallthrough
case 2:
eatit();
break;
default:
donothing();
}
ÐаÑÐ¸Ð°Ð½Ñ default
опÑионалÑнÑй. ÐопÑÑкаеÑÑÑ Ð¸ÑполÑзование вÑÑажений как в ÑÑловии switch
, Ñак и в cases
. ÐÑи пÑовеÑке на ÑавенÑÑво иÑполÑзÑеÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑÑÑогого ÑавенÑÑва ===
:
switch (1 + 3) {
case 2 + 2:
yay();
break;
default:
neverhappens();
}
ÐбÑекÑÑ
ÐбÑекÑÑ Ð² JavaScript пÑедÑÑавлÑÑÑ Ñобой коллекÑии Ð¿Ð°Ñ Ð¸Ð¼Ñ-знаÑение (клÑÑ-знаÑение). Ðни Ð¿Ð¾Ñ Ð¾Ð¶Ð¸ на:
Ðменем ÑвойÑÑва обÑекÑа в JavaScript вÑÑÑÑÐ¿Ð°ÐµÑ ÑÑÑока, а знаÑением Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбой Ñип даннÑÑ JavaScript, даже дÑÑгие обÑекÑÑ. ÐÑо позволÑÐµÑ ÑоздаваÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð»Ñбой ÑложноÑÑи.
СÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° оÑновнÑÑ ÑпоÑоба ÑоздаÑÑ Ð¾Ð±ÑекÑ:
Ð Ñакже:
Ðбе ÑÑи запиÑи делаÑÑ Ð¾Ð´Ð½Ð¾ и Ñо же. ÐÑоÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð½Ð°Ð·ÑваеÑÑÑ Ð»Ð¸ÑеÑалом обÑекÑа и более ÑдобнаÑ. Такой ÑпоÑоб ÑвлÑеÑÑÑ Ð¾Ñновой ÑоÑмаÑа JSON, и пÑи напиÑании кода лÑÑÑе иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ его.
С помоÑÑÑ Ð»Ð¸ÑеÑала обÑекÑа можно ÑоздаваÑÑ Ð½Ðµ ÑолÑко пÑÑÑÑе обÑекÑÑ, но и обÑекÑÑ Ñ Ð´Ð°Ð½Ð½Ñми:
var obj = {
name: "Carrot",
for: "Max",
details: {
color: "orange",
size: 12,
},
};
ÐоÑÑÑп к ÑвойÑÑвам обÑекÑа можно полÑÑиÑÑ ÑледÑÑÑими ÑпоÑобами:
obj.details.color; // orange
obj["details"]["size"]; // 12
ÐÑи два меÑода ÑавнознаÑнÑ. ÐеÑвÑй меÑод иÑполÑзÑеÑÑÑ, еÑли Ð¼Ñ ÑоÑно знаем к ÐºÐ°ÐºÐ¾Ð¼Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð½Ð°Ð¼ нÑжно обÑаÑиÑÑÑÑ. ÐÑоÑой меÑод пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве имени ÑвойÑÑва ÑÑÑокÑ, и позволÑÐµÑ Ð²ÑÑиÑлÑÑÑ Ð¸Ð¼Ñ Ð² пÑоÑеÑÑе вÑÑиÑлений. СледÑÐµÑ Ð¾ÑмеÑиÑÑ, ÑÑо поÑледний меÑод меÑÐ°ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑм движкам и минимизаÑоÑам опÑимизиÑоваÑÑ ÐºÐ¾Ð´. ÐÑли поÑвиÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð½Ð°Ð·Ð½Ð°ÑиÑÑ Ð² каÑеÑÑве имÑн ÑвойÑÑв обÑекÑа заÑезеÑвиÑованнÑе Ñлова, Ñо даннÑй меÑод Ñоже Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑигодиÑÑÑÑ:
// ÐÑÐ·Ð¾Ð²ÐµÑ Syntax error, Ð²ÐµÐ´Ñ 'for' ÑÑо заÑезеÑвиÑованное Ñлово
obj.for = "Simon";
// Ð ÑÑÑ Ð²ÑÑ Ð½Ð¾ÑмалÑно
obj["for"] = "Simon";
ÐолÑÑе инÑоÑмаÑии об обÑекÑÐ°Ñ Ð¸ пÑоÑоÑÐ¸Ð¿Ð°Ñ : Object.prototype.
ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии по пÑоÑоÑипам обÑекÑов и ÑепÑм пÑоÑоÑипов обÑекÑов ÑмоÑÑиÑе Inheritance and the prototype chain.
ÐаÑÑивÑÐаÑÑÐ¸Ð²Ñ Ð² JavaScript вÑего лиÑÑ ÑаÑÑнÑй ÑлÑÑай обÑекÑов. РабоÑаÑÑ Ð¾Ð½Ð¸ пÑакÑиÑеÑки одинаково (еÑли именем ÑвойÑÑва ÑвлÑеÑÑÑ ÑиÑло, Ñо доÑÑÑп к Ð½ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ ÑолÑко ÑеÑез вÑзов в ÑкобкаÑ
[]), ÑолÑко Ñ Ð¼Ð°ÑÑивов еÑÑÑ Ð¾Ð´Ð½Ð¾ ÑдивиÑелÑное ÑвойÑÑво length
(длина). Ðно возвÑаÑÐ°ÐµÑ ÑиÑло, Ñавное ÑÐ°Ð¼Ð¾Ð¼Ñ Ð±Ð¾Ð»ÑÑÐ¾Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¼Ð°ÑÑива + 1.
СоздаÑÑ Ð¼Ð°ÑÑив можно по ÑÑаÑинке:
var a = new Array();
a[0] = "dog";
a[1] = "cat";
a[2] = "hen";
a.length; // 3
Ðо гоÑаздо Ñдобнее иÑполÑзоваÑÑ Ð»Ð¸ÑеÑал маÑÑива:
var a = ["dog", "cat", "hen"];
a.length; // 3
ÐапомниÑе, ÑвойÑÑво array.length
не обÑзаÑелÑно бÑÐ´ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑлеменÑов в маÑÑиве. ÐоÑмоÑÑиÑе пÑимеÑ:
var a = ["dog", "cat", "hen"];
a[100] = "fox";
a.length; // 101
ÐапомниÑе â длина маÑÑива ÑÑо его ÑамÑй болÑÑой Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð»ÑÑ Ð¾Ð´Ð¸Ð½.
ÐÑли попÑÑаÑÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к неÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ ÑлеменÑÑ Ð¼Ð°ÑÑива, Ñо полÑÑиÑе undefined
:
typeof a[90]; // undefined
ÐÐ»Ñ Ð¿ÐµÑебоÑа ÑлеменÑов маÑÑива иÑполÑзÑйÑе Ñакой ÑпоÑоб:
for (var i = 0; i < a.length; i++) {
// СделаÑÑ ÑÑо-нибÑÐ´Ñ Ñ ÑлеменÑом a[i]
}
ES2015 пÑедÑÑавлÑÐµÑ Ð±Ð¾Ð»ÐµÐµ кÑаÑкий for...of
ÑпоÑоб обÑ
ода по иÑеÑиÑÑемÑм обÑекÑам, в Ñ.Ñ. маÑÑивам:
for (const currentValue of a) { // СделаÑÑ ÑÑо-нибÑÐ´Ñ Ñ currentValue }
ÐеÑебÑаÑÑ ÑлеменÑÑ Ð¼Ð°ÑÑива Ñакже можно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ñикла for...in
. Ðо, еÑли вдÑÑг бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¾ какое-либо ÑвойÑÑво Array.prototype
, Ñо оно Ñоже бÑÐ´ÐµÑ ÑÑаÑÑвоваÑÑ Ð² вÑбоÑке. Ðе иÑполÑзÑйÑе даннÑй меÑод.
Ð ÑамÑй новÑй ÑпоÑоб пеÑебоÑа ÑвойÑÑв маÑÑива бÑл добавлен в ECMAScript 5 â ÑÑо меÑод forEach():
["dog", "cat", "hen"].forEach(function (currentValue, index, array) {
// СделаÑÑ ÑÑо-нибÑÐ´Ñ Ñ currentValue или array[index]
});
ÐÐ»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
в маÑÑив иÑполÑзÑйÑе меÑод push()
:
У маÑÑивов еÑÑÑ ÐµÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво полезнÑÑ Ð¼ÐµÑодов. С Ð¸Ñ Ð¿Ð¾Ð»Ð½Ñм ÑпиÑком Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ознакомиÑÑÑÑ Ð¿Ð¾ ÑÑÑлке.
ÐеÑод ÐпиÑаниеa.toString()
ÐозвÑаÑÐ°ÐµÑ ÑÑÑоковое пÑедÑÑавление маÑÑива, где вÑе ÑлеменÑÑ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ñ Ð·Ð°Ð¿ÑÑÑми. a.toLocaleString()
ÐозвÑаÑÐ°ÐµÑ ÑÑÑоковое пÑедÑÑавление маÑÑива в ÑооÑвеÑÑÑвии Ñ Ð²ÑбÑанной локалÑÑ. a.concat(item1[, item2[, ...[, itemN]]])
ÐозвÑаÑÐ°ÐµÑ Ð½Ð¾Ð²Ñй маÑÑив Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ ÑказаннÑÑ
ÑлеменÑов. a.join(sep)
ÐÑеобÑазÑÐµÑ Ð¼Ð°ÑÑив в ÑÑÑокÑ, где в каÑеÑÑве ÑазделиÑÐµÐ»Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¿Ð°ÑамеÑÑ sep
a.pop()
УдалÑÐµÑ Ð¿Ð¾Ñледний ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива и возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾. a.push(item1, ..., itemN)
ÐобавлÑÐµÑ Ð¾Ð´Ð¸Ð½ или более ÑлеменÑов в ÐºÐ¾Ð½ÐµÑ Ð¼Ð°ÑÑива. a.reverse()
ÐенÑÐµÑ Ð¿Ð¾ÑÑдок ÑлеменÑов маÑÑива на обÑаÑнÑй. a.shift()
УдалÑÐµÑ Ð¿ÐµÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива и возвÑаÑÐ°ÐµÑ ÐµÐ³Ð¾. a.slice(start[, end])
ÐозвÑаÑÐ°ÐµÑ Ð½Ð¾Ð²Ñй маÑÑив. a.sort([cmpfn])
СоÑÑиÑÑÐµÑ Ð´Ð°Ð½Ð½Ñе в маÑÑиве. a.splice(start, delcount[, item1[, ...[, itemN]]])
ÐозволÑÐµÑ Ð²ÑÑезаÑÑ Ð¸Ð· маÑÑива его ÑаÑÑÑ Ð¸ добавлÑÑÑ Ð½Ð° ÑÑо меÑÑо новÑе ÑлеменÑÑ. a.unshift(item1[, item2[, ...[, itemN]]])
ÐобавлÑÐµÑ ÑлеменÑÑ Ð² наÑало маÑÑива. ФÑнкÑии
ÐаÑÑÐ´Ñ Ñ Ð¾Ð±ÑекÑами ÑÑнкÑии Ñакже ÑвлÑÑÑÑÑ ÐºÐ»ÑÑевÑми компоненÑами ÑзÑка JavaScript. ÐазовÑе ÑÑнкÑии оÑÐµÐ½Ñ Ð¿ÑоÑÑÑ:
function add(x, y) {
var total = x + y;
return total;
}
Ð ÑÑом пÑимеÑе показано пÑакÑиÑеÑки вÑÑ, ÑÑо нÑжно знаÑÑ Ð¾ ÑÑнкÑиÑÑ
. ФÑнкÑии в JavaScript могÑÑ Ð¿ÑинимаÑÑ Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ более паÑамеÑÑов. Тело ÑÑнкÑии Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð»ÑбÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ опÑеделÑÑÑ Ñвои ÑобÑÑвеннÑе пеÑеменнÑе, коÑоÑÑе бÑдÑÑ Ð´Ð»Ñ ÑÑой ÑÑнкÑии локалÑнÑми. ÐнÑÑÑÑкÑÐ¸Ñ return
иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÑаÑа знаÑÐµÐ½Ð¸Ñ Ð¸ оÑÑановки вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии. ÐÑли инÑÑÑÑкÑии return в ÑÑнкÑии Ð½ÐµÑ (или еÑÑÑ, но не Ñказано возвÑаÑаемое знаÑение), Ñо JavaScript возвÑаÑÐ¸Ñ undefined
.
Ðожно вÑзваÑÑ ÑÑнкÑиÑ, вообÑе не пеÑÐµÐ´Ð°Ð²Ð°Ñ ÐµÐ¹ паÑамеÑÑÑ. Ð Ñаком ÑлÑÑае бÑÐ´ÐµÑ ÑÑиÑаÑÑÑÑ, ÑÑо иÑ
знаÑÐµÐ½Ð¸Ñ ÑÐ°Ð²Ð½Ñ undefined
:
add(); // NaN
// ÐелÑÐ·Ñ Ð¿ÑоводиÑÑ Ñложение undefined и undefined
Ðожно пеÑедаÑÑ Ð±Ð¾Ð»ÑÑе аÑгÑменÑов, Ñем Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ ÑÑнкÑиÑ:
add(2, 3, 4); // 5
// иÑполÑзÑÑÑÑÑ ÑолÑко пеÑвÑе два аÑгÑменÑа, "4" игноÑиÑÑеÑÑÑ
ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð±ÐµÑÑмÑÑленнÑм, но на Ñамом деле ÑÑнкÑии могÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к "лиÑним" аÑгÑменÑам Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÑевдомаÑÑива arguments
, в нÑм ÑодеÑжаÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
аÑгÑменÑов, пеÑеданнÑÑ
ÑÑнкÑии. ÐавайÑе напиÑем ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½ÐµÐ¾Ð³ÑаниÑенное колиÑеÑÑво аÑгÑменÑов:
function add() {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
sum += arguments[i];
}
return sum;
}
add(2, 3, 4, 5); // 14
Ðли Ñоздадим ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ ÑÑеднего знаÑениÑ:
function avg() {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
sum += arguments[i];
}
return sum / arguments.length;
}
avg(2, 3, 4, 5); // 3.5
ÐÑо доволÑно полезно, но пÑи ÑÑом кажеÑÑÑ Ð¸Ð·Ð»Ð¸Ñне подÑобнÑм. ÐÐ»Ñ ÑменÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва кода взглÑнем на Ð·Ð°Ð¼ÐµÐ½Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÑÑива аÑгÑменÑов ÑинÑакÑиÑом оÑÑаÑоÑнÑÑ Ð¿Ð°ÑамеÑÑов. Ð ÑÑом ÑлÑÑае Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑедаваÑÑ Ð² ÑÑнкÑÐ¸Ñ Ð»Ñбое колиÑеÑÑво аÑгÑменÑов, ÑÐ¾Ñ ÑанÑÑ ÐºÐ¾Ð´ минималиÑÑиÑнÑм. ÐпеÑаÑÐ¾Ñ Ð¾ÑÑаÑоÑнÑÑ Ð¿Ð°ÑамеÑÑов иÑполÑзÑеÑÑÑ Ð² ÑпиÑке паÑамеÑÑов ÑÑнкÑии в ÑоÑмаÑе: ...variable и вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ ÑелÑй ÑпиÑок аÑгÑменÑов, Ñ ÐºÐ¾ÑоÑÑми ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана. ÐÑ Ð±Ñдем Ñакже иÑполÑзоваÑÑ Ð·Ð°Ð¼ÐµÐ½Ñ Ñикла for Ñиклом for...of Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений, коÑоÑÑе бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð½Ð°Ñа пеÑеменнаÑ.
function avg(...args) {
var sum = 0;
for (let value of args) {
sum += value;
}
return sum / args.length;
}
avg(2, 3, 4, 5); // 3.5
Ð JavaScript можно ÑоздаваÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñе ÑÑнкÑии:
var avg = function () {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
sum += arguments[i];
}
return sum / arguments.length;
};
ÐÐ°Ð½Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ ÑеманÑиÑеÑки ÑавнознаÑна запиÑи function
avg()
. ÐÑо даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸ÑполÑзоваÑÑ ÑазнÑе инÑеÑеÑнÑе ÑÑÑки. ÐÐ¾Ñ Ð¿Ð¾ÑмоÑÑиÑе, как можно "ÑпÑÑÑаÑÑ" локалÑнÑе пеÑеменнÑе в ÑÑнкÑии:
var a = 1;
var b = 2;
(function () {
var b = 3;
a += b;
})();
a; // 4
b; // 2
Ð JavaScript еÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑекÑÑÑивного вÑзова ÑÑнкÑии. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм пÑи ÑабоÑе Ñ Ð¸ÐµÑаÑÑ Ð¸ÑеÑкими (дÑевовиднÑми) ÑÑÑÑкÑÑÑами даннÑÑ (напÑÐ¸Ð¼ÐµÑ Ñакие, коÑоÑÑе вÑÑÑеÑаÑÑÑÑ Ð¿Ñи ÑабоÑе Ñ DOM).
function countChars(elm) {
if (elm.nodeType == 3) {
// TEXT_NODE
return elm.nodeValue.length;
}
var count = 0;
for (var i = 0, child; (child = elm.childNodes[i]); i++) {
count += countChars(child);
}
return count;
}
ТÑÑ Ð¼Ñ ÑÑалкиваемÑÑ Ñ Ð¿Ñоблемой: как вÑзваÑÑ ÑÑнкÑÐ¸Ñ ÑекÑÑÑивно, еÑли Ñ Ð½ÐµÑ Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸? ÐÐ»Ñ ÑÑого в JavaScript еÑÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñе ÑÑнкÑионалÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ IIFEs (Immediately Invoked Function Expressions). ÐÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹ ÑамовÑзÑваÑÑейÑÑ ÑÑнкÑии:
var charsInBody = (function counter(elm) {
if (elm.nodeType == 3) {
// TEXT_NODE
return elm.nodeValue.length;
}
var count = 0;
for (var i = 0, child; (child = elm.childNodes[i]); i++) {
count += counter(child);
}
return count;
})(document.body);
ÐÐ¼Ñ ÑÑнкÑии в пÑимеÑе доÑÑÑпно ÑолÑко внÑÑÑи Ñамой ÑÑнкÑии. ÐÑо ÑлÑÑÑÐ°ÐµÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð¸ ÑиÑаемоÑÑÑ ÐºÐ¾Ð´Ð°.
СобÑÑвеннÑе обÑекÑÑРклаÑÑиÑеÑком ÐбÑекÑно-ÐÑиенÑиÑованном ÐÑогÑаммиÑовании (ÐÐÐ) обÑекÑÑ â ÑÑо коллекÑии даннÑÑ Ð¸ меÑодов, коÑоÑÑе ÑÑими даннÑми опеÑиÑÑÑÑ. JavaScript - ÑÑо ÑзÑк, оÑнованнÑй на пÑоÑоÑÐ¸Ð¿Ð°Ñ , и в его опÑеделении Ð½ÐµÑ Ð¿Ð¾Ð½ÑÑÐ¸Ñ ÐºÐ»Ð°ÑÑов, ÑÐ°ÐºÐ¸Ñ , как в ÑзÑÐºÐ°Ñ C++ или Java. (Ðногда ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑÑаÑÑ Ð¿ÑогÑаммиÑÑов, знакомÑÑ Ñ ÑзÑками, в коÑоÑÑÑ ÐµÑÑÑ ÐºÐ»Ð°ÑÑÑ.) ÐмеÑÑо клаÑÑов JavaScript иÑполÑзÑÐµÑ ÑÑнкÑии. ÐавайÑе пÑедÑÑавим обÑÐµÐºÑ Ñ Ð»Ð¸ÑнÑми даннÑми, ÑодеÑжаÑий Ð¿Ð¾Ð»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ и Ñамилией. ÐÑÑÑ Ð´Ð²Ð° Ñипа оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð¼Ñн: "ÐÐ¼Ñ Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ" или "ФамилиÑ, ÐмÑ". С помоÑÑÑ Ð¾Ð±ÑекÑов и ÑÑнкÑий можно ÑделаÑÑ ÑледÑÑÑее:
function makePerson(first, last) {
return {
first: first,
last: last,
};
}
function personFullName(person) {
return person.first + " " + person.last;
}
function personFullNameReversed(person) {
return person.last + ", " + person.first;
}
s = makePerson("Simon", "Willison");
personFullName(s); // Simon Willison
personFullNameReversed(s); // Willison, Simon
РабоÑаеÑ, но Ñам код никÑда не годиÑÑÑ. С Ñаким Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¾Ð¼ Ñ Ð²Ð°Ñ Ð±ÑдÑÑ Ð´ÐµÑÑÑки ÑÑнкÑий, заÑоÑÑÑÑÐ¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй обÑекÑ. ÐÑо можно иÑпÑавиÑÑ, пÑикÑепив ÑÑнкÑÐ¸Ñ Ðº обÑекÑÑ. ÐÑо пÑоÑÑо, Ð²ÐµÐ´Ñ Ð²Ñе ÑÑнкÑии и еÑÑÑ Ð¾Ð±ÑекÑÑ:
function makePerson(first, last) {
return {
first: first,
last: last,
fullName: function () {
return this.first + " " + this.last;
},
fullNameReversed: function () {
return this.last + ", " + this.first;
},
};
}
s = makePerson("Simon", "Willison");
s.fullName(); // Simon Willison
s.fullNameReversed(); // Willison, Simon
Ð Ð²Ð¾Ñ ÐºÐ¾Ðµ-ÑÑо новенÑкое: клÑÑевое Ñлово this
. Ðогда this
иÑполÑзÑеÑÑÑ Ð²Ð½ÑÑÑи ÑÑнкÑии, оно ÑÑÑлаеÑÑÑ Ð½Ð° ÑекÑÑий обÑекÑ. ÐнаÑение клÑÑевого Ñлова завиÑÐ¸Ñ Ð¾Ñ ÑпоÑоба вÑзова ÑÑнкÑии. ÐÑли вÑзваÑÑ ÑÑнкÑÐ¸Ñ Ñ Ð¾Ð±ÑаÑением к обÑекÑÑ ÑеÑез ÑоÑÐºÑ Ð¸Ð»Ð¸ квадÑаÑнÑе Ñкобки, Ñо this
полÑÑиÑÑÑ ÑавнÑм Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ. Рином ÑлÑÑае this
бÑÐ´ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° глобалÑнÑй обÑекÑ. ÐÑо ÑаÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº оÑибкам. ÐапÑимеÑ:
s = makePerson("Simon", "Willison");
var fullName = s.fullName;
fullName(); // undefined undefined
ÐÑи вÑзове fullName()
, this
полÑÑÐ°ÐµÑ ÑÑÑÐ»ÐºÑ Ð½Ð° глобалÑнÑй обÑекÑ. Ð Ñак как в глобалÑном обÑекÑе не опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¿ÐµÑеменнÑе first
и last
, Ñо имеем два undefined
.
ÐÑполÑзÑÑ Ð¾ÑобенноÑÑÑ ÐºÐ»ÑÑевого Ñлова this
, можно ÑлÑÑÑиÑÑ ÐºÐ¾Ð´ ÑÑнкÑии makePerson
:
function Person(first, last) {
this.first = first;
this.last = last;
this.fullName = function () {
return this.first + " " + this.last;
};
this.fullNameReversed = function () {
return this.last + ", " + this.first;
};
}
var s = new Person("Simon", "Willison");
РпÑимеÑе Ð¼Ñ Ð¸ÑполÑзовали новое клÑÑевое Ñлово: new
. Ðно ÑеÑно ÑвÑзано Ñ this. Ðанное клÑÑевое Ñлово ÑоздаÑÑ Ð½Ð¾Ð²Ñй пÑÑÑой обÑекÑ, а поÑом вÑзÑÐ²Ð°ÐµÑ ÑказаннÑÑ ÑÑнкÑиÑ, а this
полÑÑÐ°ÐµÑ ÑÑÑÐ»ÐºÑ Ð½Ð° ÑÑÐ¾Ñ Ð½Ð¾Ð²Ñй обÑекÑ. ФÑнкÑии, коÑоÑÑе пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð²Ñзова Ñ new
назÑваÑÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑами. СÑÑеÑÑвÑÐµÑ ÑоглаÑение, ÑоглаÑно коÑоÑÐ¾Ð¼Ñ Ð²Ñе ÑÑнкÑии-конÑÑÑÑкÑоÑÑ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ñ Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ бÑквÑ.
ÐÑ Ð´Ð¾ÑабоÑали Ð½Ð°Ñ ÐºÐ¾Ð´ в пÑедÑдÑÑем пÑимеÑе, но вÑÑ Ñавно оÑÑалÑÑ Ð¾Ð´Ð¸Ð½ непÑиÑÑнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ñ ÑамоÑÑоÑÑелÑнÑм вÑзовом fullName()
.
ÐаждÑй Ñаз, когда Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа ÑоздаÑÑÑÑ Ð½Ð¾Ð²Ñй обÑекÑ, Ð¼Ñ Ð·Ð°Ð½Ð¾Ð²Ð¾ ÑоздаÑм и две новÑе ÑÑнкÑии. ÐоÑаздо Ñдобнее ÑоздаÑÑ ÑÑи ÑÑнкÑии оÑделÑно и даÑÑ Ð´Ð¾ÑÑÑп к ним конÑÑÑÑкÑоÑÑ:
function personFullName() {
return this.first + " " + this.last;
}
function personFullNameReversed() {
return this.last + ", " + this.first;
}
function Person(first, last) {
this.first = first;
this.last = last;
this.fullName = personFullName;
this.fullNameReversed = personFullNameReversed;
}
Уже лÑÑÑе: Ð¼Ñ Ñоздали ÑÑнкÑии-меÑÐ¾Ð´Ñ ÑолÑко один Ñаз, а пÑи новом вÑзове ÑÑнкÑии-конÑÑÑÑкÑоÑа пÑоÑÑо ÑÑÑлаемÑÑ Ð½Ð° Ð½Ð¸Ñ . Ðожно ÑделаÑÑ ÐµÑÑ Ð»ÑÑÑе? ÐонеÑно:
function Person(first, last) {
this.first = first;
this.last = last;
}
Person.prototype.fullName = function fullName() {
return this.first + " " + this.last;
};
Person.prototype.fullNameReversed = function fullNameReversed() {
return this.last + ", " + this.first;
};
Person.prototype
ÑÑо обÑекÑ, доÑÑÑп к коÑоÑÐ¾Ð¼Ñ ÐµÑÑÑ Ñ Ð²ÑеÑ
ÑкземплÑÑов клаÑÑа Person
. Ðн ÑоздаÑÑ Ð¾ÑобÑÑ ÑепоÑÐºÑ Ð¿ÑоÑоÑипов. ÐаждÑй Ñаз, когда Ð²Ñ Ð¿ÑÑаеÑеÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к неÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ ÑвойÑÑÐ²Ñ Ð¾Ð±ÑекÑа Person
, JavaScript пÑовеÑÑеÑ, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ ÑвойÑÑво в Person.prototype
. Ð ÑезÑлÑÑаÑе вÑе, ÑÑо пеÑедано в Person.prototype
, ÑÑановиÑÑÑ Ð´Ð¾ÑÑÑпнÑм и вÑем ÑкземплÑÑам ÑÑого конÑÑÑÑкÑоÑа ÑеÑез this
обÑекÑ.
ÐÑо оÑÐµÐ½Ñ Ð¼Ð¾ÑнÑй инÑÑÑÑменÑ. JavaScript позволÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð¿ÑоÑоÑÐ¸Ð¿Ñ Ð² лÑбое вÑемÑ, ÑÑо знаÑиÑ, ÑÑо можно добавлÑÑÑ Ð½Ð¾Ð²Ñе меÑÐ¾Ð´Ñ Ðº ÑÑÑеÑÑвÑÑÑим обÑекÑам во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑаммÑ:
s = new Person("Simon", "Willison");
s.firstNameCaps();
// TypeError on line 1: s.firstNameCaps is not a function
Person.prototype.firstNameCaps = function () {
return this.first.toUpperCase();
};
s.firstNameCaps(); // "SIMON"
ÐанимаÑелÑно Ñо, ÑÑо добавлÑÑÑ ÑвойÑÑва в пÑоÑоÑип можно и Ð´Ð»Ñ Ð²ÑÑÑоеннÑÑ
обÑекÑов JavaScript. ÐавайÑе добавим новÑй меÑод reversed
клаÑÑÑ String
, ÑÑÐ¾Ñ Ð¼ÐµÑод бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑÑÑÐ¾ÐºÑ Ð·Ð°Ð´Ð¾Ð¼ напеÑÑд:
var s = "Simon";
s.reversed(); // TypeError on line 1: s.reversed is not a function
String.prototype.reversed = function reversed() {
var r = "";
for (var i = this.length - 1; i >= 0; i--) {
r += this[i];
}
return r;
};
s.reversed(); // "nomiS"
ÐаннÑй меÑод бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð´Ð°Ð¶Ðµ на лиÑеÑÐ°Ð»Ð°Ñ ÑÑÑоки!
"This can now be reversed".reversed();
// desrever eb won nac sihT
Ðак Ñже ÑпоминалоÑÑ, prototype ÑоÑмиÑÑÐµÑ ÑаÑÑÑ ÑепоÑки. ÐонеÑнÑм обÑекÑом ÑÑой ÑепоÑки пÑоÑоÑипов ÑвлÑеÑÑÑ Object.prototype
, меÑÐ¾Ð´Ñ ÐºÐ¾ÑоÑого вклÑÑаÑÑ Ð¸ toString()
â ÑÐ¾Ñ Ð¼ÐµÑод, коÑоÑÑй вÑзÑваеÑÑÑ Ñогда, когда надо полÑÑиÑÑ ÑÑÑоковое оÑобÑажение обÑекÑа. ÐÐ¾Ñ ÑÑо можно ÑделаÑÑ Ñ Ð½Ð°Ñими обÑекÑами Person
:
var s = new Person("Simon", "Willison");
s.toString(); // [object Object]
Person.prototype.toString = function () {
return "<Person: " + this.fullName() + ">";
};
s.toString(); // "<Person: Simon Willison>"
ÐомниÑе, Ð¼Ñ Ð²ÑзÑвали avg.apply()
Ñ Ð¿ÐµÑвÑм аÑгÑменÑом ÑавнÑм null? ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑделаÑÑ Ñак: пеÑвÑм аÑгÑменÑом, пеÑеданнÑм меÑÐ¾Ð´Ñ apply()
бÑÐ´ÐµÑ Ð¾Ð±ÑекÑ, коÑоÑÑй пÑÐ¸Ð¼ÐµÑ Ð·Ð½Ð°Ñение this
. ÐÐ¾Ñ Ðº пÑимеÑÑ ÑпÑоÑÑÐ½Ð½Ð°Ñ ÑеализаÑÐ¸Ñ new
:
function trivialNew(constructor, ...args) {
var o = {}; // СоздаÑм новÑй обÑекÑ
constructor.apply(o, args);
return o;
}
ÐÑо не ÑоÑÐ½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ new
, Ñак как она не ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑепоÑÐºÑ Ð¿ÑоÑоÑипов (ÑÑо Ñложно ). ÐеÑод apply()
пÑименÑеÑÑÑ Ð½Ðµ оÑÐµÐ½Ñ ÑаÑÑо, но знаÑÑ ÐµÐ³Ð¾ важно. РпÑимеÑе вÑÑе, ÑинÑакÑÐ¸Ñ ...args
(вклÑÑÐ°Ñ Ð¼Ð½Ð¾Ð³Ð¾ÑоÑие) назÑваеÑÑÑ Ð¾ÑÑаÑоÑнÑми паÑамеÑÑами, поÑÐ¾Ð¼Ñ ÑÑо они вклÑÑаÑÑ Ð² ÑÐµÐ±Ñ Ð²Ñе оÑÑавÑиеÑÑ Ð°ÑгÑменÑÑ.
ÐÑзов
var bill = trivialNew(Person, "William", "Orange");
пÑакÑиÑеÑки полноÑÑÑÑ ÑквиваленÑен ÑÑомÑ:
var bill = new Person("William", "Orange");
Ð JavaScript меÑод apply()
Ð¸Ð¼ÐµÐµÑ Ð¿Ð¾Ñ
ожий меÑод call()
, коÑоÑÑй Ñоже позволÑÐµÑ ÑÑÑанавливаÑÑ this
, но пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑпиÑок, а не маÑÑив аÑгÑменÑов.
function lastNameCaps() {
return this.last.toUpperCase();
}
var s = new Person("Simon", "Willison");
lastNameCaps.call(s);
// ÐналогиÑно запиÑи:
s.lastNameCaps = lastNameCaps;
s.lastNameCaps(); // WILLISON
ÐложеннÑе ÑÑнкÑии
ÐбÑÑвлÑÑÑ Ð½Ð¾Ð²Ñе ÑÑнкÑии можно и внÑÑÑи дÑÑгиÑ
ÑÑнкÑий. ÐÑ Ð¸ÑполÑзовали ÑÑÐ¾Ñ Ð¿ÑиÑм ÑÑÑÑ Ð²ÑÑе, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ ÑÑнкÑÐ¸Ñ makePerson()
. ÐÐ»Ð°Ð²Ð½Ð°Ñ Ð¾ÑобенноÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ
ÑÑнкÑий в Ñом, ÑÑо они полÑÑаÑÑ Ð´Ð¾ÑÑÑп к пеÑеменнÑм, обÑÑвленнÑм в иÑ
ÑÑнкÑии-ÑодиÑеле:
function parentFunc() {
var a = 1;
function nestedFunc() {
var b = 4; // parentFunc can't use this
return a + b;
}
return nestedFunc(); // 5
}
ÐÑо оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ðµ ÑвойÑÑво, коÑоÑое Ð´ÐµÐ»Ð°ÐµÑ ÑопÑовождение кода более ÑдобнÑм. ÐÑли ваÑа ÑÑнкÑÐ¸Ñ Ð² Ñвоей ÑабоÑе иÑполÑзÑÐµÑ Ð´ÑÑгие ÑÑнкÑии, коÑоÑÑе болÑÑе нигде не иÑполÑзÑÑÑÑÑ, Ñо можно пÑоÑÑо вложиÑÑ Ð²ÑпомогаÑелÑнÑе ÑÑнкÑии в оÑновнÑÑ. ÐÑо ÑокÑаÑÐ¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑÑнкÑий в глобалÑном обÑекÑе, ÑÑо доволÑно Ð½ÐµÐ¿Ð»Ð¾Ñ Ð¾.
ÐÑÑ ÑÑо оÑлиÑнÑй ÑпоÑоб ÑокÑаÑиÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво глобалÑнÑÑ Ð¿ÐµÑеменнÑÑ . Так пÑи напиÑании кода Ñ Ð½Ð°Ñ ÑаÑÑо бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ Ð¸ÑкÑÑение понаÑоздаваÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑÑ Ð¿ÐµÑеменнÑÑ , коÑоÑÑе бÑдÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ ÑазнÑм ÑÑнкÑиÑм. ÐÑÑ ÑÑо ÑÑложнÑÐµÑ ÐºÐ¾Ð´, Ð´ÐµÐ»Ð°ÐµÑ ÐµÐ³Ð¾ менее ÑиÑаемÑм. ÐложеннÑе ÑÑнкÑии имеÑÑ Ð´Ð¾ÑÑÑп к пеÑеменнÑм Ñвоей ÑÑнкÑии-ÑодиÑелÑ, и Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑÑо Ð´Ð»Ñ Ð³ÑÑппиÑовки множеÑÑва ÑÑнкÑий вмеÑÑе (еÑÑеÑÑвенно в ÑазÑмнÑÑ Ð¿ÑÐµÐ´ÐµÐ»Ð°Ñ ), ÑÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð´ÐµÑжаÑÑ Ð½Ð°Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй обÑÐµÐºÑ Ð² ÑиÑÑоÑе и поÑÑдке.
ÐамÑÐºÐ°Ð½Ð¸Ñ (Closures)ÐÑ Ð¿Ð¾Ð´Ð¾Ñли к Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð· ÑамÑÑ Ð¼Ð¾ÑнÑÑ Ð¸ непонÑÑнÑÑ Ð¸Ð½ÑÑÑÑменÑов JavaScript. ÐавайÑе ÑазбеÑÑмÑÑ.
function makeAdder(a) {
return function (b) {
return a + b;
};
}
var x = makeAdder(5);
var y = makeAdder(20);
x(6); // ?
y(7); // ?
ФÑнкÑÐ¸Ñ makeAdder
ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð¿ÑибавлÑÐµÑ Ð¿Ð¾Ð»ÑÑенное знаÑение к знаÑениÑ, коÑоÑÑе бÑло полÑÑено пÑи Ñоздании ÑÑнкÑии.
Такой же ÑокÑÑ Ð¼Ñ Ð½Ð°Ð±Ð»Ñдали в пÑедÑдÑÑем пÑимеÑе, когда внÑÑÑенние ÑÑнкÑии полÑÑали доÑÑÑп к пеÑеменнÑм Ñой ÑÑнкÑии, в коÑоÑой бÑли обÑÑвленÑ. ТолÑко в наÑем пÑимеÑе оÑÐ½Ð¾Ð²Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ. ÐонаÑÐ°Ð»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ, ÑÑо локалÑнÑе пеÑеменнÑе пÑи ÑÑом пеÑеÑÑанÑÑ ÑÑÑеÑÑвоваÑÑ. Ðо они пÑодолжаÑÑ ÑÑÑеÑÑвоваÑÑ â инаÑе код попÑоÑÑÑ Ð½Ðµ ÑÑабоÑал бÑ. Ðдобавок ко вÑÐµÐ¼Ñ Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð´Ð²Ðµ ÑазнÑе "копии" ÑÑнкÑии makeAdder
, пÑиÑвоеннÑе ÑазнÑм пеÑеменнÑм (одна копиÑ, в коÑоÑой а
- ÑÑо 5, а во вÑоÑой а
- ÑÑо 20). ÐÐ¾Ñ ÑÑо имеем в ÑезÑлÑÑаÑе вÑзова:
x(6); // возвÑаÑÐ¸Ñ 11
y(7); // возвÑаÑÐ¸Ñ 27
Ð Ð²Ð¾Ñ ÑÑо пÑоизоÑло: когда JavaScript вÑполнÑÐµÑ ÑÑнкÑиÑ, ÑоздаÑÑÑÑ Ð¾Ð±ÑÐµÐºÑ 'scope', коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð² Ñебе вÑе локалÑнÑе пеÑеменнÑе, обÑÑвленнÑе внÑÑÑи ÑÑой ÑÑнкÑии. Ðн иниÑиализиÑÑеÑÑÑ Ð»ÑбÑм знаÑением, пеÑеданнÑм ÑÑнкÑии в каÑеÑÑве паÑамеÑÑа. 'Scope' подобен глобалÑÐ½Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð²Ñе глобалÑнÑе пеÑеменнÑе и ÑÑнкÑии, кÑоме неÑколÑÐºÐ¸Ñ Ð²Ð°Ð¶Ð½ÑÑ Ð¾ÑлиÑий: пÑи каждом вÑзове ÑÑнкÑии ÑоздаÑÑÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ 'scope' и, в оÑлиÑие Ð¾Ñ Ð³Ð»Ð¾Ð±Ð°Ð»Ñного, к обÑекÑÑ 'scope' нелÑÐ·Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿ÑÑмой доÑÑÑп из ваÑего кода. Ð Ð½ÐµÑ ÑпоÑоба пÑойÑиÑÑ Ð¿Ð¾ ÑвойÑÑвам данного обÑекÑа.
Так ÑÑо пÑи вÑзове ÑÑнкÑии makeAdder
ÑоздаÑÑÑÑ Ð½Ð¾Ð²Ñй обÑÐµÐºÑ 'scope' Ñ ÐµÐ´Ð¸Ð½ÑÑвеннÑм ÑвойÑÑвом: a
, коÑоÑÐ¾Ð¼Ñ Ð¿ÑиÑваиваеÑÑÑ Ð·Ð½Ð°Ñение, пеÑеданное ÑÑнкÑии в каÑеÑÑве аÑгÑменÑа. ÐоÑом makeAdder
возвÑаÑÐ°ÐµÑ Ð½Ð¾Ð²ÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½ÑÑ ÑÑнкÑиÑ. РлÑбом дÑÑгом ÑлÑÑае 'ÑбоÑÑик мÑÑоÑа' Ñдалил Ð±Ñ Ð¾Ð±ÑÐµÐºÑ scope, но возвÑаÑÐ°ÐµÐ¼Ð°Ñ ÑÑнкÑÐ¸Ñ ÑÑÑлаеÑÑÑ Ð½Ð° ÑÑÐ¾Ñ Ð¾Ð±ÑекÑ. РиÑоге обÑÐµÐºÑ scope не ÑдалÑеÑÑÑ Ð´Ð¾ ÑеÑ
поÑ, пока ÑÑÑеÑÑвÑÐµÑ Ñ
оÑÑ Ð±Ñ Ð¾Ð´Ð½Ð° ÑÑÑлка на него.
ÐÑе обÑекÑÑ scope ÑоединÑÑÑÑÑ Ð² ÑепоÑÐºÑ Ð¾Ð±Ð»Ð°ÑÑей видимоÑÑи, коÑоÑÐ°Ñ Ð¿Ð¾Ñ Ð¾Ð¶Ð° на ÑепоÑÐºÑ Ð¿ÑоÑоÑипов в обÑекÑной ÑиÑÑеме JavaScript.
ÐамÑкание ÑÑо ÑвÑзка из ÑÑнкÑии и обÑекÑа scope, Ñозданного пÑи ÐµÑ Ð²Ñзове. ÐодÑобнее о замÑканиÑÑ Ð·Ð´ÐµÑÑ.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4