بازگشت به مطالب

2026-04-26

حلقه for...in و inherited properties

در JavaScript، حلقه for...in فقط own propertyها را نمی‌خواند و prototype chain را هم در نظر می‌گیرد.

for...in ابزار مفیدی است، اما فقط own keys شیء را iterate نمی‌کند.
این حلقه enumerable properties ارث‌رسیده از prototype chain را هم برمی‌گرداند.

const foo = { one: 1 };
const bar = { two: 2, __proto__: foo };

console.log(Object.keys(bar)); // ["two"]

for (const key in bar) {
  console.log(key); // "two", "one"
}

اگر فقط own properties را می‌خواهید:

  • از Object.keys(obj)، Object.values(obj) یا Object.entries(obj) استفاده کنید.
  • یا داخل for...in با Object.hasOwn(obj, key) فیلتر بگذارید.
for (const key in bar) {
  if (Object.hasOwn(bar, key)) {
    console.log(key);
  }
}

دانستن این رفتار، جلوی باگ‌های سخت‌ردیابی را در object mapها می‌گیرد.