اذهب إلى المحتوى
  • 0

أريد توضيح بالأمثلة عن مفاهيم Pass by Reference و Pass by Value و Shallow copy وDeep Copy و Type Coercion في جافاسكريبت

Abdelrahman Mostafa10

السؤال

أُثناء متابعتي لدورة جافاسكريبت، هناك بعض المفاهيم أحتاج إلى إيضاح لها، وهي:

  • Pass by Reference
  •  Pass by Value
  •  Shallow copy
  • Deep Copy
  • Type Coercion

أرجو توضيح المفهوم بمثال والفائدة من ذلك ومتى نستخدمه إن أمكن.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

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

أهلا بك.

قبل أن أقوم بمقارنة صغيرة توضح الفروقات بين هذه المفاهيم، يجب أن أوضح أن لغة الجافا سكريبت هي لغة تعتمد على مفهوم ال 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

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

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...