Abdelrahman Mostafa10 نشر 8 ديسمبر 2023 أرسل تقرير نشر 8 ديسمبر 2023 أُثناء متابعتي لدورة جافاسكريبت، هناك بعض المفاهيم أحتاج إلى إيضاح لها، وهي: Pass by Reference Pass by Value Shallow copy Deep Copy Type Coercion أرجو توضيح المفهوم بمثال والفائدة من ذلك ومتى نستخدمه إن أمكن. اقتباس
0 Khaled Osama3 نشر 8 ديسمبر 2023 أرسل تقرير نشر 8 ديسمبر 2023 1. Pass by Reference: يتم إرسال عنوان المتغير (عنوان الذاكرة) وليس قيمته. فأي تغيير في المتغير داخل الدالة سيؤثر على القيمة الأصلية خارجها أيضًا. شرح بسيط لمفهوم عنوان الذاكرة عند استدعاء دالة أو طريقة وتمرير متغير إليها بالمرجع، فإن ما يتم إرساله ليس القيمة نفسها بل عنوان الذاكرة التي تحتوي على هذه القيمة. فمثلاً لو أرسلنا متغير obj إلى دالة، فإن ما سيتم إرساله هو عنوان ذاكرة الـ obj في الرام وليس القيمة نفسها. عندها إذا حدث تغيير في المتغير داخل الدالة مثلاً بتحديث قيمة خاصية ما، فسيتم التغيير في نفس عنوان الذاكرة الذي تعلق المتغير الأصلي به. بذلك سينعكس التغيير على القيمة خارج الدالة أيضاً لأن كلاهما يشيران لنفس عنوان الذاكرة. function modifyNumber(obj) { obj.value = obj.value * 2; } let myNumber = { value: 5 }; modifyNumber(myNumber); console.log(myNumber.value); // سيطبع: 10 2. Pass by Value: هو أن المتغير المرسل في دالة أو طريقة يتم نسخ قيمته وليس المرجع أو العنوان. أي أن أي تغيير في قيمة المتغير داخل الدالة لن يؤثر على القيمة الأصلية خارجها. function modifyNumber(num) { num = num * 2; } let myNumber = 5; modifyNumber(myNumber); console.log(myNumber); // سيطبع: 5 3. Shallow Copy: Shallow Copy تعني إنشاء نسخة جديدة من الهيكل الرئيسي للكائن، لكن لا يتم إنشاء نسخ فرعية للكائنات الموجودة داخله. let originalArray = [1, 2, [3, 4]]; // Shallow Copy let shallowCopy = [...originalArray]; shallowCopy[2][0] = 99; console.log(originalArray); // سيطبع: [1, 2, [99, 4]] 4. Deep Copy: Deep Copy تعني إنشاء نسخة جديدة من الهيكل الرئيسي وجميع الكائنات الفرعية داخله. let originalArray = [1, 2, [3, 4]]; // Deep Copy let deepCopy = JSON.parse(JSON.stringify(originalArray)); deepCopy[2][0] = 99; console.log(originalArray); // سيطبع: [1, 2, [3, 4]] 5. Type Coercion: هو تحويل تلقائي للأنواع في جافاسكريبت عند القيام بعمليات رياضية أو مقارنة بين قيم مختلفة. let result = 5 + "5"; console.log(result); // سيطبع: "55" فائدة استخدام كل من هذه المفاهيم تعتمد على الحالة البرمجية. مثلا، نستخدم "Pass by Reference" عندما نريد تعديل القيمة الأصلية داخل الدالة. نستخدم "Pass by Value" عندما نريد تجنب تأثير الدالة على القيمة الأصلية. "Shallow Copy" تستخدم عندما نحتاج إلى نسخة سريعة وغير مكلفة من البيانات. "Deep Copy" تستخدم عندما نحتاج إلى نسخة كاملة ومستقلة من البيانات، بدون مشاركة بين النسخ. "Type Coercion" تحدث تلقائياً في العديد من الحالات، ولكن يمكننا استخدامها عندما نحتاج إلى تحويل صريح للأنواع لضمان التناسب الصحيح. اقتباس
0 محمد سعد شحرور نشر 8 ديسمبر 2023 أرسل تقرير نشر 8 ديسمبر 2023 أهلا بك. قبل أن أقوم بمقارنة صغيرة توضح الفروقات بين هذه المفاهيم، يجب أن أوضح أن لغة الجافا سكريبت هي لغة تعتمد على مفهوم ال pass by value، عدا عندما يتعلم الأمر بال objects او ال arrays تصبح تعتمد على مفهوم ال pass by reference. اليك مقارنة بسيطة بين هذه المفاهيم مع مثال: pass by reference: يتم تطبيقه فقط على ال objects او ال arrays. هذا مفيد عندما نريد تمرير object او array الى دالة ونعدل على ال object او array الاصليين: function modifyObject(obj) { obj.property = 'modified'; obj = { newProperty: 'new value' }; // لن يؤثر على الاوبجكت الاصلي } const originalObject = { property: 'value' }; modifyObject(originalObject); console.log(originalObject); // { property: 'modified' } pass by value : لا يتم تطبيقه على ال objects او ال arrays. هذا مفيد عندما نريد تمرير متغير الى دالة، ونريد التعديل على هذا المتغير ضمن الدالة دون ان يتغير في كل البرنامج: function modifyValue(value) { value = 42; // لن يؤثر على المتغير في كل البرنامج } let originalValue = 10; modifyValue(originalValue); console.log(originalValue); // 10 shallow copy: نسخ العناصر والحقول العليا من object او array، حيث اذا عدلنا النسخة يتعدل الأصل أيضا لأنها نسخة "سطحية" نستطيع القول: const originalArray = [1, 2, { prop: 'value' }]; const shallowCopy = [...originalArray]; shallowCopy[2].prop = 'modified'; console.log(originalArray[2].prop); // 'modified' deep copy: نسخ العناصر جميعها من object او array (ليس فقط العليا) لخلق نسخة منفصلة عن الأصل، تعديلها لايعدل النسخة الأصل: const originalArray = [1, 2, { prop: 'value' }]; const deepCopy = JSON.parse(JSON.stringify(originalArray)); deepCopy[2].prop = 'modified'; console.log(originalArray[2].prop); // 'value' اقتباس
0 Ahmed Elmrsawy نشر 8 ديسمبر 2023 أرسل تقرير نشر 8 ديسمبر 2023 1. Pass by Reference (المرور عبر الإشارة): في هذا السياق، عندما يتم تمرير متغير إلى دالة، يتم تمرير إشارة (رابط) إلى الكائن الأصلي في الذاكرة، وليس نسخة جديدة من القيمة. أي تغيير يتم داخل الدالة يؤثر مباشرة على الكائن الأصلي. مثال: function edit(arr) { arr.push(4); } var myArray = [1, 2, 3]; edit(myArray); console.log(myArray); // الإخراج: [1, 2, 3, 4] فائدة: تُستخدم عندما نريد تعديل الكائن الأصلي من خلال دالة. __________________________ 2-Pass by Value (المرور عبر القيمة): في هذا السياق، يتم تمرير نسخة جديدة من القيمة إلى دالة، وأي تغيير يحدث داخل الدالة لا يؤثر على القيمة الأصلية خارج الدالة. مثال: function edit(val) { val = 10; } var myNumber = 5; edit(myNumber); console.log(myNumber); // الإخراج: 5 فائدة: تُستخدم عندما نريد تجنب تأثير التغييرات داخل الدالة على القيمة الأصلية. ___________________________________________ 3-Shallow Copy (النسخ السطحي): في النسخ السطحي، يتم إنشاء نسخة جديدة من الكائن، ولكن إذا كان الكائن يحتوي على كائنات فرعية، يتم نسخ الإشارات إلى تلك الكائنات بدلاً من إعادة إنشاء نسخ عميقة. مثال: var originalArray = [1, [2, 3]]; // النسخ السطحي باستخدام spread operator var shallowCopy = [...originalArray]; shallowCopy[1][0] = 99; console.log(originalArray[1][0]); // الإخراج: 99 _____________________________________________________ 4-Deep Copy (النسخ العميق): في النسخ العميق، يتم إنشاء نسخة جديدة من الكائن بما في ذلك جميع الكائنات الفرعية، بحيث لا تشير أي إشارات إلى الكائنات الأصلية. مثال: var originalArray = [1, [2, 3]]; // النسخ العميق باستخدام JSON var deepCopy = JSON.parse(JSON.stringify(originalArray)); deepCopy[1][0] = 99; console.log(originalArray[1][0]); // الإخراج: 2 فائدة: تُستخدم عندما نريد نسخ الكائن مع تجنب ربط الإشارات بالكائنات الأصلية. _________________ 5- Type Coercion (تحويل الأنواع): هو عملية تحويل الأنواع البيانية في لغات البرمجة تلقائيًا خلال التشغيل. على سبيل المثال، في JavaScript، قد يحدث تحويل الأنواع تلقائيًا في بعض السياقات. مثال: var num = 5; var str = "10"; var result = num + str; console.log(result); // الإخراج: "510" فائدة: تسمح بالتعامل بشكل أكثر مرونة مع الأنواع المختلفة، ولكن قد تؤدي أحيانًا إلى نتائج غير متوقعة، لذلك يجب استخدامها بحذر. You اقتباس
السؤال
Abdelrahman Mostafa10
أُثناء متابعتي لدورة جافاسكريبت، هناك بعض المفاهيم أحتاج إلى إيضاح لها، وهي:
أرجو توضيح المفهوم بمثال والفائدة من ذلك ومتى نستخدمه إن أمكن.
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.