✍️ 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 فقط تغییر نکردن ورودی و، هرجا لازم است، تازه بودن خروجی را بررسی میکند؛ آن را تغییر نده.