ESC را فشار دهید تا بسته شود

چرا دو آبجکت یا شئ در جاوا اسکریپت باهم برابر نیستند؟

توی جاوا اسکریپت دو آبجکت یا شئ ممکنه باهم برابر نباشن حتی اگر به هم دیگه شبیه باشن. خب علتش چیه؟

برای مثال کد زیر رو نگاه کنین که دو آبجکت به نظر شبیه به هم اما باهم برابر نیستن

const object1 = {
  name: "Ali",
  age:25
}
const object2 = {
  name: "Ali",
  age:25
}
console.log(object1 === object2)
// false

همونطوری که دیدین object1 و object2 مقدارهای برابری دارن با ویژگی های یکسان اما باز هم باهم برابر نیستن و خروجی به ما false برمیگردونه 😥

حالا بریم توی آرایه ها هم بررسی کنیم همین موضوع رو

یادمون نره آرایه ها هم یک نوع خاص از آبجکت ها هستن

const arr1 = [1, 2, 3, 4]
const arr2 = [1, 2, 3, 4]
console.log(arr1 === arr2)
// false

واسه درک این موضوع تو باید بدونی که primitive و reference values ها توی جاوا اسکریپت چی هستن

بررسی Primitive و Reference Values

اینو با مثال توضیح بدیم بهتره

همیشه Primitive Value یک مقدار ثابت میگیرن و نوع یا تایپ اون مقدار هم همیشه ثابته، اما Reference Values گروهی از مقادیر که ممکنه این گروه مقادیر تایپ های مختلفی رو باهم داشته باشن.

خب خوبه که بدونیم Primitive Value شامل تایپ های string, number, boolean, null, undefined, symbol و bigInt هستن که همگی توی حافظه stack ذخیره میشن. برای مثال:

//Primitive Values 👇
const name = "Ali"
const age = 25
const socialId = null
const isActive = true

و به این شکل هم توی حافظه stack ذخیره میشن

اما Reference values ها از نوع آبجکت یا همون شئ هستن که شامل آبجکت ها، آرایه ها و فانکشن ها هستن و این نقادیر هم همگی داینامیک هستن که میتونن کلی مقدار مختلف بگیرن و هرموقع بخواین این مقادیر قابل تغییر هستن و توی حافظه heap ذخیره میشن با یه reference value که اون توی stack ذخیره میشه

//reference value 👇
const array = [1, 2, 3, 4]
const obj = { name: "Ali", age: 25 }
function greeting() {
  console.log('welcome Ali')
}

اما خب این مدل چطوری توی heap و stack ذخیره میشن رو هم بریم تصویری ببینیم که قابل لمس تر باشه براتون

اگه به تصویر بالا نگاه کنین متوجه میشین که reference value یه آدرسه که به موقعیت اون داده یا همون دیتا توی حافظه heap اشاره میکنه. 👌

بررسی Primitive و Reference Values

مقایسه Primitive و Reference Values

اول بریم سراغ primitive values ها که وقتی تو داری اونارو با هم مقایسه میکنی در اصل داری مقدار استاتیک یا value اونارو باهم بررسی میکنی که این مقدارها اگر یکسان باشن پس حتما توی حافظه stack هم سایز یکسانی دارن

//Comparing Primitive Values
const name1 = "ali"
const name2 = "ali"
console.log(name1 === name2) //true ✅

داستان از این قراره که جاوا اسکریپت میاد متغیرهای name1 و name2 رو توی حافظه stack بررسی میکنه و اگر ببینه مقدارهای مساوی دارن پس اونا رو باهم برابر تشخیص میده و true برمیگردونه.

حالا بریم سراغ reference values که توی این نوع آبجکت رخ میده، جاوا اسکریپت میاد و آدرس ها رو باهم مقایسه میکنه و نه مقادیر رو.

اینو بنویس که بدونی توی primitive values دقیقا مقادیر باهم مقایسه میشن اما توی reference values آدرس ها باهم مقایسه میشن

بازم برای درک بهتر بریم بررسی کنیم این حالت رو که فرض میکنیم ما دوتا آرایه داریم که میخوایم باهم مقایسه شون کنیم و ببینیم جاوا اسکریپت چطور این مقایسه رو انجام میده

//Comparing Reference values
let arr1 = [1, 2, 3]
let arr2 = [1, 2, 3]

حالا چطوری توی heap و stack این مقایسه انجام میشه

می بینیم که دوتا آرایه آدرس های متفاوتی دارن پس وقتی آدرس هاشون باهم مقایسه بشه متوجه میشیم که درسته هر دوتا یکسان بنظر میرسن اما آدرس های متفاوتی دارن پس قطعا مساوی نیستن چرا؟ چون توی این حالت تو [۱,۲,۳] === [۱,۲,۳] رو باهم مقایسه نمیکنی بلکه داری آدرس هاشون رو باهم مقایسه میکنی یعنی refArr1 === refArr2

پس چطوریarr1 میتونه با arr2 برابر باشه؟

تو باید همچین کاری کنی:

let arr1 = [1, 2, 3]
let arr2 = arr1
console.log(arr1 === arr2) // true ✅👌

وقتی arr1 برابر arr2 قرار میدیم یعنی reference آرایه ۱ رو به آرایه۲ اختصاص دادی و دقیقا همونجایی که arr2 تو حافظه heap قرار داره arr1 هم همون آدرس رو توی heap میگیره

امیدوارم این مطلب بدردتون خورده باشه و خوب تونسته باشم مبحث رو منتقل کنم

توی کامنت یا شبکه های اجتماعی هم هرسوالی داشتین بپرسین

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *