حلقه while و for

ما اغلب نیاز داریم که یک سری عملیات رو تکرار کنیم.

برای مثال ، خروجی کالا ها از یک لیست یکی پس از دیگری یا فقط یکی کدی رو به تعداد دفعاتی میخواهیم اجرا کنیم.

حلقه ها راه حلی برای تکرار چندین بار کد ها هستن.

حلقه while

حلقه while همچنین syntax ی داره:

تا زمانی که مقدار condition ، true باشه کد داخل بدنه حلقه اجرا میشه.

برای مثال ، خروجی کد زیر تا زمانی که i< 3 هست اجرا میشه.

اجرای هر بار بدنه حلقه یک iteration نامیده میشه. حلقه بالا سه iteration دارد.

در کد بالا اگه i++ نبود کد تا همیشه اجرا میشد. در عمل مرورگر راهی برای متوقف کردن همچنین حلقه های ارائه میده و در جاوااسکریئت server-side  میتونیم این فرایند رو متوقف کنیم.

هر عبارت یا متغیری میتونه شرط حلقه باشه.شرط محاسبه شده به boolean تبدیل میشود.

برای نمونه ، راه کوتاه تر برای نوشتن while (i != 0) ، while (i) هست:


آکولاد ها برای بدنه های یک خطی نیاز نیستند.

اگر بدنه حلقه شما یک خط هست میتونیم آکولاد ها رو حذف کنیم:


 

حلقه do…While

شرط پاینتر از بدنه while قرار میگیره:

در این حلقه ابتدا بدنه اجرا میشه بعد شرط بررسی میشه و تا زمانی که شرط true باشه بدنه اجرا میشه.

برای نمونه :

این شکل syntax میتونه فقط برای زمانس استفاده بشه که حلقه صرف نظر از اینکه شرط true باشه حداقل یکبار اجرا میشه.

معمولا شکل دیگر  while(…) {…}ارجعیت داره.

 

حلقه for

حلقه for نسبتا پیچیده تر هست . احتمالا رایجترین حلقه هم هست.

syntax حلقه for:

بذارید در این قسمت با مثال راحتر متوجه بشیم.

در کد زیر alert(i) برای i از ۰ تا ۳ بار اجرا میشه.

بیایی بخش بخش دستور for رو بررسی کنیم:

بخش
begin i = 0 یک بار در ورود به حلقه اجرا میشه.
condition i < 3 قبل از اجرای هر iteration بررسی میشه اگر false باشه حلقه متوقف میشه.
body alert(i) بدنه حلقه ، تا زمانی که شرط true باشه اجرا میشه.
step i++ بعد از بدنه در ار iteration اجرا میشه.

عموما الگوریتم حلقه مثل همین کار میکنه:

به این معنا که اول begin اجرا میشه و سپس تکرار میشه.

بعد از بررسی هر condition و body و step اجرا میشن.

دقیقا میخوایم بفهمیم که چه اتفاقی می افته :


تعریف خطی متغیر

اینجا متغیر شمارنده i درست در حلقه تعریف شده که تعریف خطی متغیر نامیده میشود.

چنین متغیر های فقط را داخل حلقه ها میشه دید.

جای تعریف متغیر ما میتونستیم از یک متغیری که وجود داره استفاده کنیم:


پریدن از قسمت های for

هر قسمتی از for رو میتونیم از قلم بندازیم.

برای نمونه میتونی قسمت begin رو در صورتی که نیاز نداریم ابتدا کاری بکنیم رو حذف کنیم.
مثل نمونه زیر:

همچنین ما میتونیم step رو حذف کنیم:

این باعث میشه حلقه ای مشابه while (i < 3) بسازیم.

ما می توانیم همه چیز را حذف کنیم و یک حلقه نامحدود ایجاد کنیم:

دقت داشته باشید دو سیمیکالن باید وجود داشته باشند وگر نه خطای syntax خواهیم داشت.

 

شکستن حلقه (break)

در حالت عادی حلقه تا زمانی که شرط false نباشه اجرا میشه.

اما ما میتونیم با استفاده از دستور break مستقیم درهر زمانی خارج بشیم.

برای مثال در حلقه زیر از کاربر یک سری اعداد رو میخواد زمانی که کاربر عددی وارد نکنه از حلقه میاد بیرون:

شکستن حلقه در خط (*) فعال شده درصورتی که کاربر یک خط خالی یا لغو کنه بلافاصله حلقه متوقف میشه و اولین کد بعد از حلقه اجرا میشه.

ترکیب حلقه بینهایت + شکستن (break) برای مواقعی که نباید در اول یا آخر حلقه بررسی شود بلکه در بدنه یا وسط کد ها و حتی در چندین جا بررسی شوند کاربرد دارند.

ادامه iteration بعدی

دستور continue نسخه سبکتر از دستور break هست.

این دستور حلقه رو متوقف نمیکنه بجاش iteration فعلی رو متوقف میکنه و حلقه رو وادار به اجرای iteration جدید میکنه (درصورتی که شرط برقرار باشد).

ما میتونیم از شرط if بررسی کنیم که کد فعلی انجام شود یا به مرحله بعد برود.

حلقه زیر از continue استفاده کرده برای مقادیر فرد:

برای مقادیر زوج ادامه اجرای بدنه حلقه را متوقف میکند و به iteration بعدی میرود.

بنابر این فقط برای مقادیر فرد تابع alert اجرا میشود.

 


عملگر continue کمک میکند که تو در تو بودن کاهش پیدا کند.

یک حلقه نمایش مقادیر فرد میتونه مثل این باشه :

از نظر فنی این با مثال بالایی یکسان هست.

مسلما ما میتونیم به جای continue بدنه کد رو با شرط if در یک بلاک قرار بدیم.

اما به عنوان تاثیر جانبی ما سطح کد(nesting) رو بیشتر کردیم که در صورتی که کد های داخل if بیشتر از چند خط هست میتونه خوانایی کد رو کاهش بده.


 


break/continue برای سمت راست ‘؟’

لطفا به یاد داشته باشید که این syntax ها برای عملگر های سه گانه ‘؟’ قایل استفاده نیست.

مثلا کد زیر را در نظر بگیریم:

و اونو با علامت سوال بازنویسی کنیم:

برنامه اینجا به دلیل syntax error متوقف میشه.

این یکی دیگه از دلایل استفاده نکردن از ? به جای if هست.


 

برچسپ برای break/continue

بعضی مواقع ما نیاز داریم با break از حلقه های تو در تو خارج بشیم.

برای مثال در کد زیر ما روی i , j  حلقه داریم ، با prompt مختصات (۰,۰) تا (۲,۲) رو اعلان میکنیم:

ما یه راه حلی برای وقتی که کاربر cancel رو میزنه تا فرآیند رو متوقف کنیم نیاز داریم.

معمولا break میتواند حلقه داخلی رو بشکنه.

که این برای نیاز ما کافی نیست.

یک برچسپ یونیک با ‘:’ قبل از حلقه :

دستور break <labelName> از حلقه با نام برچسپ نوشته خارج میشود:

پس بعد break outer از خط (*) شکسته و alert(‘Done!’) رو اجرا میکنه.

همچنین ما میتونیم برچسپ ها رو در یه خط جداگانه بنویسیم:

برای continue هم مانند break میتونیم پرش داشته باشیم.


بچسپ ها اجازه پرش به هر جایی رو ندارند

پرش ها اجازه خودسرانه به هر جایی از کد را ندارند.

برا نمونه انجام کار زیر غیر ممکن هست :

فرخوانی break/continue با برچسپ فقط داخل حلقه ها و جایی که باید برچسپ ها قبل از break /continue قرار بگیرند.


 

خلاصه

ما سه نوع حلقه رو شناختیم :

  • while – قبل از هر تکرار شرایط بررسی می شود.
  • do..while – شرایط پس از هر تکرار بررسی می شود.
  • for (;;) – قبل از هر بار تکرار شرایط ، تنظیمات بیشتری نسبت به while دارد.

برای ساختن حلقه بینهایت از while(true) میتونیم استفاده کنیم،چنیچ حلقه های رو میشه با break متوقف کرد.

اگر نخواهیم در مرحله فعلی کاری انجام بدیم و  به iteration بعدی بریم از break استفاده میکنیم.

دستورات break / continue از برچسپ حلقه ها پشتیبانی میکنند که بتونیم از حلقه های تودرتو خلاص شیم.

 

منبع :javascript.info

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *