كثيرا ما تواجهنا حالة المقارنة بين كائنين أو أكثر ضمن الجافا سكريبت خاصة عند التعامل مع ال 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 :)
أتمنى أن يكون المقال قد افادكم لقراءة نفس المقال بالانجليزية :
لمزيد من المواضيع المفصلة بالجافا سكريبت :