javascriptfor...inپیمایش ویژگیها با for...in در جاوااسکریپت
for...in در جاوااسکریپت نام ویژگیهای شمارشپذیر را پیمایش میکند؛ دسترسی با براکت، ویژگی ارثی و بررسی Object.hasOwn را با مثال بشناسید.
مفهوم به زبان ساده
وقتی نام ویژگیهای یک شیء را لازم داریم، for...in میتواند آنها را بهترتیب پیمایش در اختیارمان بگذارد. متغیر حلقه نام ویژگی را به شکل رشته میگیرد؛ برای خواندن مقدار باید object[key] بنویسیم. این ساختار با for...of فرق دارد؛ for...of روی مقدارهای دادهٔ پیمایشپذیر کار میکند و یک شیء ساده لزوماً چنین قراردادی ندارد.
نکتهٔ مهم این است که for...in فقط ویژگیهای خود شیء را نمیبیند؛ ویژگیهای رشتهای شمارشپذیرِ ارثی را هم ممکن است ببیند. در مثال، یک ویژگی مشترک را فقط برای نشاندادن همین تفاوت در شیء پایه قرار دادهایم. با Object.hasOwn بررسی میکنیم کدام نام واقعاً متعلق به خود course است و فقط همانها را چاپ میکنیم.
اگر فقط ویژگیهای خود شیء را میخواهید، Object.keys و پیمایش آرایهٔ حاصل نیز انتخاب روشنی است. برای آرایهٔ درسها معمولاً for...of یا روشهای آرایه مناسبترند؛ for...in میتواند ویژگیهای اضافی را هم وارد محاسبه کند و اندیس را به شکل رشته میدهد. هنگام پیمایش، از افزودن و حذف بیبرنامهٔ ویژگیها پرهیز کنید. برای تمرین، یک ویژگی تازه روی خود course اضافه کنید و توضیح دهید چرا در خروجی چاپ میشود، ولی ویژگی مشترک کنار گذاشته میماند.
کجا به کار میآید؟
- خواندن نام و مقدار ویژگیهای یک شیء تنظیمات
- تفکیک ویژگی خود شیء از ویژگی ارثی هنگام پیمایش
از تعریف تا یک مثال واقعی
const course = Object.create({ shared: 'عمومی' });
course.title = 'جاوااسکریپت';
course.lessons = 3;
for (const key in course) {
if (!Object.hasOwn(course, key)) continue;
console.log(key + ': ' + course[key]);
}
title: جاوااسکریپت lessons: 3
این مثال چطور کار میکند؟
course یک ویژگی شمارشپذیر مشترک را از شیء پایه میگیرد.
title و lessons روی خود course قرار میگیرند.
Object.hasOwn فقط نامهای متعلق به خود course را میپذیرد.
با براکت، مقدار نام متغیر key خوانده میشود و shared چاپ نمیشود.
اشتباه رایج
course.key دنبال ویژگیای با نام ثابت key میگردد؛ برای نامی که در متغیر است از course[key] استفاده کنید. for...in هم جایگزین عمومی پیمایش مقدارهای آرایه نیست.
این را به خاطر بسپارید
for...in نام ویژگی میدهد و میتواند ارثیها را هم ببیند؛ مالکیت ویژگی را بر اساس هدف بررسی کنید.