Roog Roog نشر 4 أغسطس 2023 أرسل تقرير نشر 4 أغسطس 2023 let car={ make:'kia', model:'rio', year: 1999 } let car1={ make:'kia', model:'rio', year: 1999 } let compareCar=function(car,car1){ if ( car.key=== car1.key && car[key]===car1[key]) return true; else return false; } let result=compareCar(car,car1); console.log(result); سؤال من بعد اذنكون: ليش لما بستخدم && بيعطيني خطأ انو (key is not defined) وبس استخدم || ما بيطلع هاد الخطأ . وليش الكود ما عم يشتغل ، برأيي انا انو الفكرة ظابطة 😅، شكرا سلفا. 1 اقتباس
0 Mustafa Suleiman نشر 4 أغسطس 2023 أرسل تقرير نشر 4 أغسطس 2023 بتاريخ 6 دقائق مضت قال Roog Roog: سؤال اذا ممكن : ليش لما بستخدم && بيعطيني خطأ انو (key is not defined) وبس استخدم || ما بيطلع هاد الخطأ . وسؤالي بالنسبة للكود كان: انو ليش ما اشتغل صح ، حسيت انا انو الطريقة صح ،شكرا في دالة compareCar، يجب أن تقوم بالمقارنة بين جميع خصائص الكائنين car و car1، لذلك يحتاج الدالة إلى إجراء حلقة للتحقق من جميع الخصائص. عند التحقق من الخصائص، يجب استخدام [] بدلاً من . للوصول إلى قيمة الخاصية، لأن اسم الخاصية غير معروف مسبقًا. عند التحقق من قيمة الخاصية، يجب استخدام === للمقارنة بين القيم وليس == لأن === يقارن أيضًا نوع القيمة. وإليك الحل الصحيح: let car = { make: 'kia', model: 'rio', year: 1999 }; let car1 = { make: 'kia', model: 'rio', year: 1999 }; let compareCar = function(car, car1) { // الحصول على مفاتيح الكائنين let keys1 = Object.keys(car); let keys2 = Object.keys(car1); // التحقق مما إذا كان عدد المفاتيح متساويًا if (keys1.length !== keys2.length) { return false; } // مقارنة مفاتيح وقيم الكائنين for (let key of keys1) { if (car[key] !== car1[key]) { return false; } } return true; }; let result = compareCar(car, car1); console.log(result); // النتيجة: true وبخصوص سؤالك بتاريخ 6 دقائق مضت قال Roog Roog: ليش لما بستخدم && بيعطيني خطأ انو (key is not defined) وبس استخدم || ما بيطلع هاد الخطأ . عند استخدام && في الشرط، فإنه يقوم بتقييم الشرط بالكامل قبل أن يقرر إذا ما كان يجب تنفيذ الجزء الذي يليه أم لا. وفي حالة الشرط car.key === car1.key && car[key] === car1[key]، الجزء الأول car.key === car1.key يقارن بين الخاصية key في الكائن car والكائن car1. لكن في تلك الحالة، لا يوجد خاصية اسمها key موجودة في كلا الكائنين، لذلك يتم رفع خطأ key is not defined، ولا يتم الوصول للجزء الثاني من الشرط. بالنسبة لاستخدام ||، عند استخدامه في الشرط car.key === car1.key || car[key] === car1[key]، فإنه يقوم بتقييم الشرط وإذا كان أي جزء من الشرط صحيحًا (بمعنى أن الخاصية key موجودة في أحد الكائنين)، فإنه يعتبر الشرط صحيحًا دون الحاجة للتحقق من الجزء الثاني من الشرط. ولذلك لا يظهر خطأ key is not defined عند استخدام ||. لحل المشكلة والقيام بالمقارنة بطريقة صحيحة، تستطيع استخدام الأسلوب الذي قمت بتصحيحه في الكود السابق باستخدام حلقة for لمقارنة جميع الخصائص. 1 اقتباس
0 Kais Hasan نشر 4 أغسطس 2023 أرسل تقرير نشر 4 أغسطس 2023 إن المعاملان && , || لديهما خاصية تدعى بالدارة القصيرة short circuit و التي تعني أنه يتم التنفيذ بشكل تسلسلي للشروط، و في حال كنا متأكدين من قيمة الشرط في لحظة ما لا يتم متابعة التنفيذ. في حالة && فإنها تقف في حال وجدت أي شرط خاطئ، لأن عملية and ستكون نتيجتها false في حال كان أي شرط false. أما في حالة || فإنها تقف في حال وجدت أي شرط صحيح، لأن عملية or ستكون نتيجتها true في حال كان أي شرط true. لذلك في حالة استعمالك لل and كان الشرط الأول صحيح فأكمل و نفذ الشرط الثاني. أما في حالة استعمالك لل or فقد وجد الشرط الأول صحيح فلم يكمل، لذلك لم يظهر الخطأ. 1 اقتباس
0 Roog Roog نشر 4 أغسطس 2023 الكاتب أرسل تقرير نشر 4 أغسطس 2023 شكرا . انا كنت مفكر باستخدامي (car.key) بكون عم استهدف اسم الخواص للكائن properties. وباستخدامي (car[key]) بكون عم استهدف قيمة الخواص value. 1 اقتباس
0 Adnane Kadri نشر 4 أغسطس 2023 أرسل تقرير نشر 4 أغسطس 2023 بتاريخ 3 ساعة قال Roog Roog: شكرا . انا كنت مفكر باستخدامي (car.key) بكون عم استهدف اسم الخواص للكائن properties. وباستخدامي (car[key]) بكون عم استهدف قيمة الخواص value. فهمك تقريبا صحيح، فبإستعمالك السياق التالي: car.key أنت تحاول قراءة الخاصية key من الكائن car، فإن كان الكائن car هو ما كالتالي: const car = { key: 'value', color: 'blue', brand: 'Toyota' }; كان عائد car.key هو 'value' أما السياق التالي: car[key] فهو سيعني قراءة الخاصية الموافقة لقيمة المتغير key. فإن كان المتغير key هو ما كالتالي: var key = 'brand'; فإن الموافق لـ car[key] سيكون هو 'Toyota' وليس 'value' 1 اقتباس
0 محمد Fahmy نشر 4 أغسطس 2023 أرسل تقرير نشر 4 أغسطس 2023 الخطأ الذي تواجهه مرتبط بالطريقة التي تقوم بها بمقارنة الخصائص (properties) بين الكائنين car و car1 في دالة compareCar. دعوني أشرح مشكلتك وأقدم لك الحلاً: 1. المشكلة الأولى: في السطر: if (car.key === car1.key && car[key] === car1[key]) أنت تحاول الوصول إلى خاصية "key" في الكائنين car و car1، ولكن هذه الخاصية ليست معرفة مسبقًا في هذه الكائنات. هذا هو ما يسبب الخطأ "key is not defined". 2. المشكلة الثانية: عند استخدام && ، يعتمد JavaScript على تنفيذ المقارنات بالترتيب المحدد. إذا كانت القيمة undefined (لأن المتغير key لم يتم تعريفه بعد) في الشرط الأول ، فيتوقف عن التنفيذ ويحتفظ بالقيمة `undefined` ويعرض رسالة الخطأ. وفي حالة `||` ، يعتبر القيمة `undefined` قيمة "غير حقيقية" أو "false" ومن ثم ينتقل إلى التعبير الثاني. 3. عدم اختبار الخصائص المحددة: كنت تحاول الوصول إلى الخصاصية key ، ولكن ما تريده في الواقع هو مقارنة الخصائص المحددة (make، model، year) بين الكائنين. لتصحيح هذا، يمكنك استخدام الكود التالي: let compareCar = function(car, car1) { if (car.make === car1.make && car.model === car1.model && car.year === car1.year) { return true; } else { return false; } } حل أفضل استخدم المتغير المحدد في حلقة التكرار (for in) للمقارنة بين مفاتيح الكائنين. الكود الصحيح: let car = { make: 'kia', model: 'rio', year: 1999 }; let car1 = { make: 'kia', model: 'rio', year: 1999 }; let compareCar = function(car, car1) { for (let key in car) { if (car[key] !== car1[key]) { return false; } } return true; }; let result = compareCar(car, car1); console.log(result); بعد التعديلات المذكورة أعلاه، يجب أن يعمل الكود بشكل صحيح ويُطبع "true" إذا كانت جميع المفاتيح والقيم متطابقة و "false" في حالة عدم التطابق. 1 اقتباس
0 Roog Roog نشر 7 أغسطس 2023 الكاتب أرسل تقرير نشر 7 أغسطس 2023 بتاريخ On 4/8/2023 at 12:52 قال Mustafa Suleiman: في دالة compareCar، يجب أن تقوم بالمقارنة بين جميع خصائص الكائنين car و car1، لذلك يحتاج الدالة إلى إجراء حلقة للتحقق من جميع الخصائص. عند التحقق من الخصائص، يجب استخدام [] بدلاً من . للوصول إلى قيمة الخاصية، لأن اسم الخاصية غير معروف مسبقًا. عند التحقق من قيمة الخاصية، يجب استخدام === للمقارنة بين القيم وليس == لأن === يقارن أيضًا نوع القيمة. وإليك الحل الصحيح: let car = { make: 'kia', model: 'rio', year: 1999 }; let car1 = { make: 'kia', model: 'rio', year: 1999 }; let compareCar = function(car, car1) { // الحصول على مفاتيح الكائنين let keys1 = Object.keys(car); let keys2 = Object.keys(car1); // التحقق مما إذا كان عدد المفاتيح متساويًا if (keys1.length !== keys2.length) { return false; } // مقارنة مفاتيح وقيم الكائنين for (let key of keys1) { if (car[key] !== car1[key]) { return false; } } return true; }; let result = compareCar(car, car1); console.log(result); // النتيجة: true وبخصوص سؤالك عند استخدام && في الشرط، فإنه يقوم بتقييم الشرط بالكامل قبل أن يقرر إذا ما كان يجب تنفيذ الجزء الذي يليه أم لا. وفي حالة الشرط car.key === car1.key && car[key] === car1[key]، الجزء الأول car.key === car1.key يقارن بين الخاصية key في الكائن car والكائن car1. لكن في تلك الحالة، لا يوجد خاصية اسمها key موجودة في كلا الكائنين، لذلك يتم رفع خطأ key is not defined، ولا يتم الوصول للجزء الثاني من الشرط. بالنسبة لاستخدام ||، عند استخدامه في الشرط car.key === car1.key || car[key] === car1[key]، فإنه يقوم بتقييم الشرط وإذا كان أي جزء من الشرط صحيحًا (بمعنى أن الخاصية key موجودة في أحد الكائنين)، فإنه يعتبر الشرط صحيحًا دون الحاجة للتحقق من الجزء الثاني من الشرط. ولذلك لا يظهر خطأ key is not defined عند استخدام ||. لحل المشكلة والقيام بالمقارنة بطريقة صحيحة، تستطيع استخدام الأسلوب الذي قمت بتصحيحه في الكود السابق باستخدام حلقة for لمقارنة جميع الخصائص. بالشرط الاول قارنا طول properties وبالشرط التاني قارنا values حسب ما فهمت . بس وين قارنا properties اذا متطابقين مش الطول . شكرا. اقتباس
السؤال
Roog Roog
سؤال من بعد اذنكون:
ليش لما بستخدم && بيعطيني خطأ انو (key is not defined) وبس استخدم || ما بيطلع هاد الخطأ .
وليش الكود ما عم يشتغل ، برأيي انا انو الفكرة ظابطة 😅، شكرا سلفا.
6 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.