حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش جاوااسکریپت تکمیلی؛ توابع و پردازش داده

کپی سطحی شیء در جاوااسکریپت؛ ترتیب spread و ویژگی تازه

destructuring و spread و rest در جاوااسکریپت · 0٪

✍️ spread روی شیء، ویژگی‌های سطح اول را داخل شیء تازه کپی می‌کنه. می‌تونیم بعد از کپی، یک ویژگی را با مقدار جدید بنویسیم. اگر یک نام چند بار بیاد، آخرین مقدار برنده است. پس ترتیب {...profile, city: newCity} با {city: newCity, ...profile} یکسان نیست.

این کپی سطحی است؛ یعنی اگر یک ویژگی خودش شیء باشه، مرجع همان شیء داخلی کپی می‌شه. برای تغییر شهر که یک ویژگی سطح اول است، همین روش کافی است. ولی اگر قصد تغییر ویژگی توی preferences را داشتیم، باید آن قسمت داخلی را هم جدا کپی می‌کردیم. در این تمرین ویژگی‌های داخلی را فقط می‌خوانیم.

یک خطای رایج اینه که const copy = profile را کپی حساب کنیم. این فقط نام دوم برای همان شیء می‌سازه؛ تغییر copy به اصل هم می‌رسه. تمرین ازت می‌خواد نسخه تغییرکرده و اصل را کنار هم برگردونی تا این تفاوت دیده بشه. شهر جدید حتی اگر با شهر قبلی برابر باشه معتبره و سایر ویژگی‌ها باید حفظ شوند.

فعالیت شما

copyProfile(profile, newCity) را اصلاح کن. profile یک شیء JSON دارای city رشته‌ای و ویژگی‌های دلخواه دیگر است؛ newCity رشته است. خروجی {copy,original} باشد؛ copy کپی سطحی با city جدید و original مقدار بدون تغییر profile. سایر ویژگی‌ها، از جمله اشیای داخلی، حفظ شوند؛ ({name:'آوا',city:'قم'},'یزد') فقط شهر copy را عوض کند. تابع کمکی آماده checkCopyProfileUnchanged فقط تغییر نکردن ورودی و، هرجا لازم است، تازه بودن خروجی را بررسی می‌کند؛ آن را تغییر نده.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

فعالیت‌های این بخش به اشتراک فعال نیاز دارند. تهیهٔ اشتراک

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

function copyProfile(profile, newCity) {
  // TODO: کپی سطح اول بساز و فقط شهر کپی را عوض کن.
}
function checkCopyProfileUnchanged(profile, newCity) {
  const before = JSON.stringify([profile, newCity]);
  const result = copyProfile(profile, newCity);
  return JSON.stringify([profile, newCity]) === before && result.copy !== profile;
}