ميزات جافا سكريبت --تحبها ام تكرهها

console.log(8 * null)
// → 0
console.log("5" - 1)
// → 4
console.log("5" + 1)
// → 51
console.log("five" * 2)
// → NaN

كمطور برمجيات عمل على لغة السي شارب لسنوات

استغربت حقا عندما رايت كود جافا سكريبت هذا

اي منطق من ضرب ثمانية ب"لا تعيين " واعتباره صفر

او طرح الرقم 1 من عبارة "5"

شخصيا لا اجد ان هذا الامر نوع من المرونة ولا اجده يسهل تعلم البرمجة للمبتدئين

ما الغاية من جعل لغة الجافا سكريبت مهلهلة جدا من ناحية اكتشاف وتحديد الاخطاء البرمجية المنطقية وثم اعتبار ذلك ميزة فيها؟!

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

تبدوا جافاسكربت غريبة ولا منطقية بسبب أنها تتبنى آلية في علوم الحاسوب تعرف بالتحويل الضمني implicit type conversions mechanism وهي بشكل بسيط تحويلات أنواع البيانات إلى نوع بيانات آخر اثناء تنفيذ واجراء عملية ما مثل التي تقوم بها، تعرف أيضا بالـ  الاكراه او coercion فعى سبيل المثال قبل طباعة خرج النتيجة:

 console.log("5" + 1)

ستقوم جافاسكربت بتغليب النوع "string" على النوع "number" و طباعة دمج السلستين النصيتين لأنها لا تتوقع من المستخدمين ان يقوموا بجمع سلسلة نصية مع عدد ولكنها تقبل كشيء منطقي أكثر أن يقام بدمجهما ضمن سلسلة نصية أخرى.

ما الأكثر منطقية برأيك؟ أن تقوم بعرض خرج عن خطأ لمحاولة جمع عدد مع سلسلة نصية أم ان تقوم بتحويل العدد الى سلسلة نصية وجمعهما ضمن سلسلة أخرى ليتم التعامل مع هذا الخرج لاحقا بمنطق عادي.

ونفس الأمر تقريبا بالنسبة لباقي الاجراءات الاخرى.

رغم أن هذا المفهوم يختلف قليلا بين العديد من اللغات الا انه يتشابه بين اللغات المبنية على C أو C-like languages.

ورغم أنه توجد هنالك طرق لتفادي هذا التحويل الضمني مثل تصريح التحويل قبل تنفيذ أي اجراءات حساسة Explicit type conversion إلا أن جافاسكربت تعطيك فرصة أخرى في حالة نسيت :). هذا بسبب كون جافاسكربت نفسها لغة ضعيفة الكتابة loosely typed language (بالطبع لا يعني هذا أنها ضعيفة). فهي ستكتشف نوع البيانات لديك وستجري التعديلات اللازمة حتى لا تضطر أنت نفسك إلى إعادة تحديد أنواع البيانات. وبالطبع فإن هذا سيوفر الوقت في تعلم العديد من خطوات التحويل المختلفة وإعلانات نوع البيانات و و ..وهاته واحدة من الأسباب التي تجعل هذا الأمر ميزة وليس عيبا.

أي كأن الأمر محاولة ذكية من جافاسكربت لفرض نوع بيانات متوقع على نوع بيانات غير متوقع، ويكون هذا لتفادي تعطيل تنفيذ الإجراءات أثناء التفاعل مع وظائف او توابع او مكونات تستعمل جافاسكربت ليمكن التعامل مع هاته الاجراءات بشكل برمجي.

عمليا، لن تحوي التطبيقات المبنية على الجافاسكربت هاته الأمور بشكل مبالغ فيه، ولكنها تبقى شيئ جانبي له دواعي استعماله. وكأن الأمر لامنطقي فعلا سطحيا، ولكنه يتبنى الكثير من المنطقية في مضمونه.

لست بصدد تفسير الامر

انا بصدد مناقشة لماذا المجتمع البرمجي قام ببناء لغة الجافا سكريبت بهذا الشكل ولماذا لا يتم اصلاح العيوب فيه

اقصد هل لهذا فوائد عملية وهل له علاقة بدواعي استخدامها في الويب

لست الوحيد الذي ينتقد جافا سكريبت بهذا الخصوص في واقع الأمر فإن جافا سكريب تحتوي على العديد من العمليات اللامنطقية وهي ليست بميزة مطلقا بل عيوب حقيقية, لا أدري من يعتبر الأمر ميزة؟

مميزات اللغة كثيرة جدا, وإلا ما كانت لتكون لغة برمجة الويب الأولى أو بالأحرى الوحيدة, فكما قال بيارن ستروستروب مخترع لغة س++: هناك نوعان فقط من لغات البرمجة, لغة يتذمر بشأنها الجميع ولغة لا يستخدمها أحد.

لا اعتقد ان الامر عيب

اعتقد ان له داعي

لان هناك كتيبة من العلماء ومجتمع نحل من المبرمجين الفطاحل المستعدين لاصلاح العيوب لو كانت عيوب

لا أقصد بالعيوب كونها أخطاء تم الإغفال عنها, بل هي لها مبررها هذا المبرر الذي يسوقونها غير منطقي وعيب بالنسبة لي.

مثلا في مثالك عن عملية الإضافة + لنعتبر أن المتغير a هو عبارة 1 في حين المتغير b هو العدد 1

var a = "1"
var b = 1
console.log(a + b);

في هذه الحالة سنحصل على النتيجة 11 لأنه يتم اعتبار المتغير a عبارة تم إضافتها إلى رقم 1, لكن لو أردنا أن نعطي لa خصائص العدد 1 فإنه علينا فقط إضافة + قبل a.

var a = "1"
var b = 1
console.log(+a + b);

أي أن المسألة ليست بخطأ باللغة بل لها فلسفتها الخاصة لكيف تسري الأمور, ولكن هذه الفلسفة لا أراها ذات جدوى بل عيبا قد يوقع المبرمجين بالأخطاء سهوا, لأنه بدل أن يعتبر الجافا سكريب اعتبار المتغير a عبارة خطأ فإنه سيقبلها مما يجعل النتيجة خاطئة بالنسبة للمبرمج الذي سهى وأضاف "" للعدد, وإلا فما الفائدة أصلا من هذه الإمكانية؟

هذا مثال واحد فقط أما الأمثلة فمتعددة.

سؤالي لماذا اعتمدت هذه الفلسفة

هل لهذا علاقة بتطبيقاتها العملية

لا أدري صراحة, يقول البعض أنها لتقليل الأخطاء حيث أنه لا توجد مرحلة compilation بالجافاسكريبت, وبالتالي فهو جيد للمبتدئين الذين يكثرون من الأخطاء ولكنه تبرير غير مقنع بالمرة. لأن العملية مثلا + بالمثال السابق ليس لها نفس النتائج بعملية -, أضف أن المبرمج يريد إضافة 1 إلى 1 وأخطأ ووضع "" أي أن نتيجته ستكون خاطئة على غير ما كان يرغب به. فرسالة خطأ أفضل من نتيجة مشوهة بهذه الحالة.

تماما لهذا اسئل السؤال

لكنني مقتنع بوجود تبرير منطقي

تقريبا كل ما أعرفهم وبدأ بتعلم البرمجة من خلال جافا سكريبت، كان له نفس رأيك عمران، وأتفق معك لم أحبها أبدا، وأجد أنها معقدة والأكواد البرمجية الخاصة بها بعضها لا منطقي ولا يقتنع به العقل، لكن الغريب عندما أتناقش بهذه النقطة مع مبرمجين متخصصين وذو خبرة، يشعروني أننا من لا نفهم الجافا سكريبت، وأنها من أهم اللغات ويمكن من خلالها كذا وكذا ويبدأوا بسرد مميزاتها، أشعر معها بالغباء على عكس لغات أخرى جربتها مثل الcss و html مثلا.

أنا كمبرمج جافاسكريبت أرى الغرابة في السي شارب وأنت كمبرج سي شارب ترى الغرابة في الجافاسكريبت

بالنسبة للسطرين فهما يحملان نفس النتيجة حتى في السي شارب فالسطر الأول سيظهر بنفس النتيجة والسطر الثاني سيحمل رسالة خطأ تختلف بحسب اللغتين

console.log("5" + 1)
console.log("five" * 2)

بالنسبة للسطر التالي فأنا أراها ميزة واختصار لعملية الtype conversion والتي يجب عليك إجباريا أن تقوم بها في سي شارب في حين أنت ترى أن العملية الاجبارية في السي شارب ميزة أنا أراها مضيعة للوقت لشيء واضح ومفهوم لمفسر الكود.

console.log("5" - 1)

أما السطر التالي فهو يحمل نفس فكرة الtype conversion تقريبا حيث سيقوم المفسر باستبدال الnull بالصفر كبديل

console.log(8 * null)

لأنه وبكل بساطة إذا واجهت قيمة null في السي شارب في عملية حسابية فإن مفسر السي شارب سيعطيك (لاشيء) وتنبيه على شكل مثلث أصفر بينما العملية لا تعتبر خطأً كل ما ستواجهه هو (فراغ) مما سيضطرك لعمل إجراء لحل المعضلة باستخدام IF والتي هي وبمحض الصدفة نستخدمها أيضا في حل نفس المعضلة.

مرحبا

أريد مساعدتكم في بعض الشيء

في الدردشة الخاصة بي يوجد حائط لنشر الصور والمنشورات وما شابه ذلك

ويوجد خيار وهو زر اللايك , عندما يتم الضغط على زر اللايك

لايظهر من الذي قام بالإعجاب , اريد فقط من يعدل لي هذا الكود بحال قام شخص ما في الاعجاب بالمنشورات تظهر رسالة مثلا

هذا الشخص قام بالاعجاب مع اسمه وصورته عن طريق السوكيت الذي يسحب اي دي الصورة والاسم

هل هناك من يستطيع تعديله؟؟

else {
                                    if (lavayah.cmd == "likebc") {
                                      var shance = [];
                                      if (UserInfo[florine.id]) {
                                        BarsRepo.getById(lavayah.data.bid).then(function (lexanni) {
                                          if (lexanni) {
                                            if (lexanni.likes) {
                                              shance = JSON.parse(lexanni.likes);
                                              var ziaan = shance.findIndex(function (biaggio) {
                                                return biaggio == UserInfo[florine.id].idreg;
                                              });
                                            } else {
                                              ziaan = -1;
                                            }
                                            if (ziaan != -1) {} else {
                                              shance.push(UserInfo[florine.id].idreg);
                                              BarsRepo.updateLiked({bid: lexanni.bid, likes: JSON.stringify(shance)}).then(function (sergey) {
                                                if (sergey) {
                                                  BarsRepo.getById(lexanni.bid).then(function (kaitlen) {
                                                    if (kaitlen) {
                                                      io.emit("msg", {cmd: "bc^", data: {bid: lexanni.bid, likes: kaitlen.likes}});

عندما تفهم الطريقة التي تعمل بها جافا اسكربت ستدرك ان هذة المخرجات منطقية .

جافا اسكربت تقوم بعملية تسمى type coercion و هي عملية تحول النوع إلى نوع آخر. و هي عملية تقوم بها اسكربت تلقائيا.

مثلا: في المثال الأول تقوم جافا تسكربت بتحويل الnull إلى نوع رقمي و هو ال0 و حاصل ضرب 0 على اي رقم هو ال 0