كثيرا ما تواجهنا حالة المقارنة بين كائنين أو أكثر ضمن الجافا سكريبت خاصة عند التعامل مع ال API وفي هذه الحالة يجب علينا التفريق بين المقارنة السطحية shallow والمقارنة المعمقة deep

لفهم هذين المصطلحين يجب علينا أولا فهم كيف تقوم الجافا سكريبت بحفظ الكائنات في الذاكرة

عند انشاء كائن جديد سواء باستخدام الكلمة المفتاحية new او باستخدام اقواس انشاء الكائن {} ففي كلا الحالتين تقوم الجافا سكريبت بتفريغ موقع في الذاكرة لحفظ الكائن وتعطي هذا الكائن مرجعية reference

وتقوم بتخزين المرجعية ضمن اسم المتغير

let student1={id:1,name:"omaran",languages:["java","javascript","python","c#"]}

ان المتغير student1 يحفظ المرجعية او العنوان في الذاكرة وليس الكائن كاملا تماما كالفرق بين المنزل وعنوان المنزل

لذلك اذا قمنا بانشاء كائن اخر بنفس القيم تماما وقارنا بين الكائنين فالنتيجة هي false بما ان العنوانين مختلفين

let student2={id:1,name:"omaran",languages:["java","javascript","python","c#"]}
console.log(student1==student2) ///output false

وهذا ما يسمى المقارنة السطحية shallow

اما اذا اردنا القيام بمقارنة عميقة عندئذ يجب علينا المقارنة بين كل خاصية property للكائن وهنا يجب الانتباه ان الخاصية coding languages هي مصفوفة اي ايضا تخزن ضمن مرجعية وعند مقارنتها بعمق يجب مقارنتها عنصر عنصر على حدا

let matchId= student1.id==student2.id
let matchName=student1.name==student2.name
let matchCodingLanguages=student1.codeingLanguages.length==student2.codingLnaguages.length

for(let i=0;i<student1.codingLanguages;i++){
if(student1.codingLanguages[i] !=student2.codingLanguages[i]){
matchCodingLanguages=false
}
}
console.log(mathcId && matchName && matchCodingLanguages) //Output true :)

أتمنى أن يكون المقال قد افادكم لقراءة نفس المقال بالانجليزية :

لمزيد من المواضيع المفصلة بالجافا سكريبت :