Skip to content

Latest commit

 

History

History
75 lines (51 loc) · 10.2 KB

Mastering the For Loop in JavaScript.md

File metadata and controls

75 lines (51 loc) · 10.2 KB

Ի՞նչ կլինի եթե for ցիկլի կառուցվածքային մասերից որևէ մեկը կամ մի քանիսը բաց թողենք: Նաև մանրամասն կդիտարկենք for ցիկլի աշխատանքային քայլերի հաջորդականությունը:

Նախ վերհիշենք, թե ինֆորմատիկայում ինչ են իրենցից ներկայացնում ցիկլերը և ինչ կառուցվածքային մասերից է բաղկացած for ցիկլը։ Ցիկլը բարձր մակարդակի ծրագրավորման լեզուներում օգտագործվող կոնստրուկցիայի տարատեսակ է, որն օգնում է հեշտ և արագ կազմակերպել մի կամ մի քանի հրահանգների բազմաթիվ անգամ կատարումը։ for ցիկլն առկա է հանրաճանաչ ծրագրավորման լեզուների մեծ մասում, և համարվում է ամենաշատ օգտագործվող ցիկլը։ Սինթաքսն ունի հետևյալ տեսքը՝

for (սկիզբ; պայման; քայլ) {
  ("ցիկլի մարմին");
}

Ենթադրենք մեզ պետք է բրաուզերի պատուհանում alert անել 0, 1 և 2 թվերը։ Առանց ցիկլի օգտագործման մենք այն կգրեյինք հետևյալ կերպ՝

alert(0);
alert(1);
alert(2);

Հիմա նույն բանն անենք for ցիկլի օգնությամբ՝

for (let i = 0; i < 3; i++) {
  alert(i);
}

Երբ ցիկլը սկսում է աշխատանքը, սկզբում կատարվում է let i = 0 արտահայտությունը, այսինքն մենք հայտարարում ենք i անունով փոփոխական և նրան վերագրում ենք 0 սկզբնական արժեքը։ Այս արտահայտությունը ցիկլի ողջ աշխատանքի ընթացքում կատարվում է ընդամենը մեկ անգամ։ Այսինքն սկզբում այս վերագրումը կատարվեց, ու վերջ, մենք կարող ենք այս արտահայտության մասին այլևս մոռանալ։

Հաջորդը կատարվում է պայմանի ստուգումը՝ մեր օրինակում i < 3: Մենք i փոփոխականին վերագրել ենք 0 արժեքը, հետևաբար պայմանի ստուգման արտահայտությունը կլինի 0 < 3։ 03-ից փոքր է, այսինքն արտահայտությունը ճիշտ է, և համեմատության օպերատորը՝ մեր պարագայում <-ի նշանը, վերադարձնում է true: Որպեսզի ցիկլը շարունակի աշխատանքը, պետք է պայմանի ստուգման արդյունքում միշտ վերադառնա true: Որ պահին այդ արտահայտությունը վերադարձրեց false, ցիկլի աշխատանքը նույն պահին կդադարի։ Մեր օրինակում պայմանի ստուգման արդյունքը true էր, հետևաբար ցիկլը շարունակում է աշխատել, անցնենք առաջ։

Այստեղ ուշադրություն՝ հաջորդը ոչ թե կատարվում է քայլը, ինչպես շատերին թվում է ըստ գրելաձևի հերթականության, այլ ցիկլի մարմնում գտնվող հրահանգը։ Այսինքն մեր օրինակում՝ բրաուզերի պատուհանում կատարվում է alert(0), քանի-որ i-արժեքը 0 է։ Ստացվում է մենք սկզբում ստեղծեցինք i փոփոխականը և վերագրեցինք նրան 0 արժեքը, ապա պայմանի ստուգման արտահայտության մեջ ստուգեցինք թե արդյոք i-ն փոքր էր 3-ից, ստացանք դրական պատասխան՝ true, և միանգամից մտանք ցիկլի մարմնի մեջ գրված հրահանգը կատարելու, այն է՝ alert անել i փոփոխականը, որը հիմա 0 է։ alert-ը կատարվեց, անցնենք առաջ։

Հաջորդը նոր կատարվում է քայլը, որը մեր օրինակի մեջ i++-ն է։ Ինչպես գիտենք ++ օպերատորը կոչվում է ինկրեմենտի օպերատոր, և այն փոփոխականի արժեքը մեծացնում է 1-ով։ Մեր փոփոխականի արժեքը այլևս նախնական վերագրված 0-ն չէ, այլ դարձել է 1։ Այս քայլով եզրափակվում է ցիկլի աշխատանքի մի շրջանը, այդ պատճառով այն երբեմն կոչվում է նաև ԵԶՐԱՓԱԿԻՉ ԱՐՏԱՀԱՅՏՈՒԹՅՈՒՆ։

Այս ամբողջ շրջանը՝ պայմանի ստուգում, ցիկլի մարմնում տրված հրահանգի կատարում, ապա եզրափակիչ արտահայտության (քայլի) մեջ փոփոխականի արժեքի փոփոխությունը, անվանում են իտերացիա։

Մեր ցիկլի աշխատանքը դեռևս չի ավարտվել, ավարտվել է իտերացիան, այսինքն աշխատանքի մի շրջանը, սակայն ցիկլը կարող է ունենալ բազմաթիվ իտերացիաներ։ Եզրափակիչ քայլից հետո, երբ փոփոխականը դարձավ 1, նորից կատարվում է պայմանի ստուգում։ 1 < 3 արտահայտությունը ճիշտ է, համեմատության օպերատորը վերադարձնում է true, նորից գործողությունն անցնում է ցիկլի մարմին և alert է արվում 1-ը, քանի-որ i փոփոխականն այժմ ունի 1 արժեքը։ Ապա կատարվում է իտերացիայի եզրափակիչ քայլը՝ մեր օրինակում i++-ը, և i փոփոխականն այժմ էլ դառնում է 2։ Ավարտվեց ցիկլի աշխատանքի երկրորդ շրջանը, կամ ինչպես ընդունված է ասել՝ իտերացիան։

Նորից կատարվում է պայմանի ստուգում՝ 2 < 3, արտահայտությունը կրկին ճիշտ է, համեմատության օպերատորը վերադարձնում է true և սկսվում է ցիկլի աշխատանքի երրորդ իտերացիան։ Գործողությունն անցնում է ցիկլի մարմնում գրված հրահանգի կատարմանը, alert է արվում 2, ապա իտերացիան եզրափակվում է i փոփոխականի ինկրեմենտացիայով, և i-ի արժեքը 2-ից դառնում է 3, ու մեր երրորդ իտերացիան ավարտվում է։

Այժմ պարզ է, որ պետք է նորից կատարվի պայմանի ստուգում, որի արդյունքից կախված ցիկլում կսկսվի կամ չի սկսվի չորրորդ իտերացիան։ 3 < 3 արտահայտությունը սխալ է, հետևաբար համեմատության օպերատորն այս անգամ վերադարձնում է false: Ցիկլն անհապաղ դադարեցնում է իր աշխատանքը, և արդեն կարելի է ասել, որ մեր օրինակում ցիկլը կատարեց երեք իտերացիա։ Նշենք նաև, որ եթե ցիկլի մարմնում ընդամենը մի հրահանգ է տրված, ապա ձևավոր փակագծերը կարող ենք բաց թողնել։ Երկու և ավելի հրահանգի առկայության դեպքում ձևավոր փակագծերի բաց թողնելը կհանգեցնի սխալի։ Մեր օրինակում՝

for (let i = 0; i < 3; i++) alert(i);

Ընտրությունն իհարկե ձերն է, սակայն ձևավոր փակագծերը շատերի կարծիքով բավականին լավացնում են կոդի ընթեռնելիությունը:

Իսկ ի՞նչ կլինի, եթե փորձենք բաց թողնել for ցիկլի կառուցվածքային մասերը։ Նշեմ, որ փակագծերի մեջ գտնվող բոլոր երեք արտահայտություններն էլ ոչ պարտադիր (օպցիոնալ) են։ Օրինակ բերեք մեր օրինակը գրենք, բաց թողնելով սկիզբը՝

let i = 0;
for (; i < 3; i++) alert(i);

Այստեղ մենք փոփոխականը հայտարարեցինք և նրան արժեք վերագրեցինք ցիկլի մարմնից դուրս։ Օրինակը նույն ձև նորմալ աշխատում է, հետևաբար կարող ենք եզրակացնել, որ սկիզբը մենք կարող ենք բաց թողնել։ Այժմ փորձենք բաց թողնել նաև եզրափակիչ քայլը՝

let i = 0;
for (; i < 3; ) alert(i++);

Այստեղ մենք եզրափակիչ քայլում կատարվող արտահայտությունն ուղղակի տեղափոխեցինք ցիկլի մարմին, և այն դարձավ while (i < 3) alert(i++) ցիկլի անալոգը։

Մենք կարող ենք բաց թողնել նաև պայմանը և ստանալ անվերջ ցիկլ, սակայն որպեսզի այն հնարավոր լինի ինչ-որ պահի ընդհատել, կարող ենք օգտվել break ցիկլի կառավարման հրահանգի օգնությունից՝

let i = 0;
for (;;) {
  if (i === 3) break;
  alert(i++);
}

Վերջին տարբերակը՝ for (;;) {ցիկլի մարմինը} շատ հաճախ օգտագործվում է կառավարելի անվերջ ցիկլեր ստանալու համար։ Նաև որպես լրացում նշեմ, որ թեև ցիկլի վերոհիշյալ մասերը կարող ենք բաց թողնել, որովհետև դրանք ոչ պարտադիր են, սակայն այդ մասերն իրարից բաժանող կետ ստորակետերը ՊԱՐՏԱԴԻՐ է դնել, հակառակ դեպքում կստանանք սինթաքսի սխալ։