javascriptPrimitive values and object referencesمقدار ساده و اشتراک مرجع در جاوااسکریپت
تفاوت مقدار ساده و مرجع شیء در جاوااسکریپت را با پیشنویس ویرایش بشناسید؛ انتساب، تغییر ویژگی و دلیل مستقلنبودن کپی ظاهری را ببینید.
مفهوم به زبان ساده
عدد، رشته و بولی از نوعهای سادهاند. مقدار ساده تغییرناپذیر است، ولی متغیری که با let آن را نگه میدارد میتواند به مقدار تازهای متصل شود. وقتی عددی را به نام دوم نسبت میدهید، تغییر انتساب نام دوم مقدار نام اول را عوض نمیکند. این تفاوت در فرمهایی که مقدار اولیه و مقدار موقت دارند اهمیت پیدا میکند.
برای شیء، آرایه و تابع، انتساب نام دوم به همان داده میتواند اشتراک مرجع ایجاد کند. تغییر ویژگی شیء از طریق نام دوم، از طریق نام اول هم دیده میشود؛ چون دو شیء مستقل نساختهایم. خود مرجع نیز بهصورت مقدار منتقل میشود؛ بنابراین گفتن اینکه جاوااسکریپت «همهٔ شیءها را با مرجع به تابع میفرستد» بدون توضیح، گمراهکننده است. انتساب دوبارهٔ پارامتر، متغیر فرستنده را دوباره مقداردهی نمیکند.
در مثال، پیشنویس کالا در واقع همان شیء اصلی است و تغییر عنوان، دادهٔ اصلی را هم عوض میکند. پیش از ساخت دکمهٔ انصراف، مالکیت داده و نقطهٔ ذخیره را مشخص کنید. برای دادهٔ تخت، کپی سطحی ممکن است کافی باشد؛ برای دادهٔ تو در تو، سطحهای مشترک را هم باید آگاهانه مدیریت کنید.
کجا به کار میآید؟
- تشخیص علت تغییر دادهٔ اصلی هنگام ویرایش یک پیشنویس
- طراحی دکمهٔ انصراف بدون اثر جانبی بر شیء اصلی
از تعریف تا یک مثال واقعی
let originalCount = 2;
let draftCount = originalCount;
draftCount = 3;
console.log(originalCount);
const product = { title: 'دفتر' };
const draft = product;
draft.title = 'کتاب';
console.log(product.title);
console.log(draft === product);
2 کتاب true
این مثال چطور کار میکند؟
انتساب عدد به draftCount یک مقدار مستقل برای انتساب بعدی میدهد.
draft و product به همان شیء اشاره میکنند.
ویرایش title از هر دو نام دیده میشود و مقایسهٔ هویت true است.
اشتباه رایج
const draft = product کپی مستقل نمیسازد. const هم ویژگیهای درون شیء را خودکار تغییرناپذیر نمیکند؛ فقط انتساب دوبارهٔ همان نام را محدود میکند.
این را به خاطر بسپارید
برای تحلیل تغییرها، نام متغیر، مقدار ساده و هویت شیء را از هم جدا کنید.