همونطور که اطلاع دارید در جلسه قبل بحث مربوط به Moduleها رو به پایان رسوندیم و شما رو با همه ویژگیهای اون آشنا کردیم. در این جلسه میخوایم موضوع Iteratorها رو شروع کنیم و با توضیحات و مثالهای کاربردی، اونا رو برای شما توضیح بدیم. برای این آموزش از این لینک به عنوان منبع استفاده میکنیم.
یادگیری Iteratorها خیلی میتونه برای شما ارزشمند باشه چون از اون در موارد دیگه نیز استفاده شده است. پس با یادگیری مفهمومی Iteratorها میتونین به راحتی با Promise و Generator و Set و Map و ... نیز آشنا بشید و اونا رو درک کنید.
مفاهیم Iterator و Iterable
در ES6 یک قابلیت جدید به نام Iterator اضافه شده است که امکانات خاصی رو در اختیار ما قرار میده. این قابلیت رفتار تکرار شدن اشیاء در Javascript رو مشخص میکنند.
هر شئ Iterable یا تکرار شدنی یک متد با کلید Symbol.iterator دارد. این متد یک شئ تکرار شدنی رو برمی گردونه. کد زیر رو در نظر بگیرید:
let iterableObject = { [Symbol.iterator]() { return iteratorObject; } };
Symbol.iterator یک سمبل شناخته شده است. اگر شما در مورد سمبلها اطلاعاتی ندارید، میتونین این لینک رو مطالعه کنید.
همونطور که دیدید در اینجا و بصورت از پیش تعریف شده برای Iteratorها با استفاده از Symbol.iterator اینکار انجام شده است. در ادامه روشهای دیگه برای تعریف یک iterable رو بهتون آموزش میدیم.
یک شئ تکرار شدنی یا Iterator، ساختار داده ای است که متدی با نام
دارد. زمانی که متد next برای یک شئ تکرار شدنی فراخوانی میشود، المنت بعدی به همراه یک مقدار Boolean که نشان دهنده پایان تکرار یا Iteration هست برگشت داده میشه. بصورت زیر:let iteratorObject = { next() { return { done: true, value: undefined }; } };
همونطور که میبینید متد next یک شئ حاوی 2 کلید رو برگشت میده:
- همونطور که میبینید در کد بالا مقدار done برابر با true میباشد. true بودن کلید done به این معنا است که تکرار المنتها به پایان رسیده است و دیگه المنتی وجود ندارد. در این حالت مقدار value نیز برابر با undefined خواهد بود.
- تا زمانی که المنت در تکرار مورد نظر وجود داشته باشد، المنت به عنوان مقدار value در نظر گرفته میشود. در این حالت چون iteration به پایان نرسیده است، مقدار done برابر با false خواهد بود.
تکرار بر روی حرفهای رشته
رشته ها، آرایهها و ... همگی iterable هستند و میتونین از متد next برای اونا استفاده کنید. مثلا فرض کنید که یک رشته hi داشته باشیم. بصورت زیر میتونیم به حرفهای اون دسترسی داشته باشیم:
const someString = "hi"; var iterator = someString[Symbol.iterator](); console.log(iterator.next()); console.log(iterator.next()); console.log(iterator.next());
همونطور که میبینید در خط اول یک رشته رو تعریف کردیم. برای اینکه مطمئن بشیم که رشتهها iterable هستند یا خیر، میتونین در Console عبارت
میبینید که Symbol.iterator وجود دارد و این به معنای iterable بودن رشتهها هست. پس در کد بالا و در خط 3 به این متد دسترسی پیدا کردیم و اون رو برای رشته مورد نظر فراخوانی کردیم. با اینکار رشته مورد نظر به یک iteration تبدیل میشه و اون رو درون متغیر مورد نظر ذخیره میکنیم. حالا میتونیم با استفاده از متد next به همه حروف رشته مورد نظر دسترسی داشته باشیم. خروجی کد بالا در Console بصورت زیر خواهد بود:
میبینید که مقادیر مورد نظر چاپ شده اند. در دو حالت اول چون 2 حرف در رشته وجود دارد، مقدار done برابر با false است و در حالت سوم چون حروف به پایان میرسند، مقدار done برابر با true میشه. اگر متد next رو دفعات بیشتری نیز صدا بزنید، تفاوتی نخواهد کرد و همین حالت سوم رو برگشت میده.
در جلسه بعد بیشتر در مورد Iterationها براتون توضیح میدم.
موفق و پیروز باشید.
یا علی
اولین دیدگاه این پست رو تو بنویس !