أفضل ميمي جافا سكريبت رأيته بالتفصيل
TLDR: أرغم نفسك على استخدام يساوي الثلاثي.
لقد وجدت عن غير قصد ميم JavaScript هذا على Reddit ، وهو أفضل ما رأيته على الإطلاق.
يمكنك التحقق من دقة هذا الميم عن طريق تشغيل كل مقتطف رمز في Developer Tools. النتيجة ليست مفاجئة ، لكنها لا تزال مخيبة للآمال.
بالطبع تقودني هذه التجربة الصغيرة إلى التساؤل ...
لماذا يحدث هذا؟
من خلال الخبرة ، تعلمت تبني جوانب جافا سكريبت الناعمة أثناء التحذير من أشجار الصنوبر الشائكة. ومع ذلك ، فإن تفاصيل هذه القضية الركنية ما زالت تزعجني.
إنه تمامًا كما يقول كايل سيمبسون ...
"لا أعتقد أن أي شخص يعرف JS حقًا ، ليس تمامًا على أي حال."
عندما تظهر هذه الحالات ، فمن الأفضل الرجوع إلى المصدر - مواصفات ECMAScript الرسمية التي تم إنشاء JavaScript منها.
مع وجود المواصفات في متناول اليد ، دعونا نفهم بعمق ما يحدث هنا.
الجلسة الأولى - إدخال الإكراه
إذا كنت تعمل 0 == "0"
في وحدة تحكم المطور الخاصة بك ، فلماذا تعود true
؟
0
هو رقم ، "0"
وهو سلسلة ، يجب ألا يكونا متماثلين أبدًا! معظم لغات البرمجة تحترم ذلك. 0 == "0"
في Java ، على سبيل المثال ، تُرجع هذا:
error: incomparable types: int and String
هذا منطقي تمامًا. إذا كنت تريد مقارنة int و String في Java ، فيجب عليك أولاً تحويلهما إلى نفس النوع.
ولكن هذا هو JavaScript ، أنتم جميعا!
عند مقارنة قيمتين عبر ==
، قد تخضع إحدى القيمتين للإكراه .
الإكراه- تغيير القيمة تلقائيًا من نوع إلى آخر.
تلقائيا هي الكلمة الرئيسية هنا. بدلاً منتحويل الأنواع الخاصة بك بشكل صريح ، يقوم JavaScript بذلك من خلف الكواليس.
يعد هذا مناسبًا إذا كنت تستغلها عن قصد ، ولكنها قد تكون ضارة إذا لم تكن على دراية بآثارها.
إليك مواصفات لغة ECMAScript الرسمية على ذلك. سأعيد صياغة الجزء ذي الصلة:
إذا كانت x عبارة عن رقم وكانت y عبارة عن سلسلة ، فقم بإرجاع x == ToNumber (y)
لذلك بالنسبة لحالتنا 0 == "0"
:
نظرًا لأن 0 عبارة عن رقم و "0" عبارة عن سلسلة ، يتم إرجاع 0 == ToNumber ("0")
"0"
تم تحويل الخيط الخاص بنا سرًا إلى 0
، والآن لدينا تطابق!
0 == "0" // true // The second 0 became a number! // so 0 equals 0 is true....
الحق غريب؟ حسنًا ، تعتاد على ذلك ، لم ننتهي حتى منتصف الطريق.
اللوحة 2 - المصفوفات تتعرض للإكراه أيضًا
لا يقتصر هذا الهراء على البدائيين مثل السلاسل أو الأرقام أو القيم المنطقية. ها هي المقارنة التالية:
0 == [] // true // What happened...?
القسر مرة أخرى! سأعيد صياغة الجزء ذي الصلة من المواصفات:
إذا كانت x عبارة عن سلسلة أو رقم وكانت y هي كائن ، فقم بإرجاع x == ToPrimitive (y)
ثلاثة أشياء هنا:
1. نعم ، المصفوفات كائنات
آسف لكسر ذلك لك.
2. يصبح المصفوفة الفارغة سلسلة فارغة
مرة أخرى وفقًا للمواصفات ، يبحث JS أولاً عن طريقة الكائن toString
لإجباره.
في حالة المصفوفات ، toString
يجمع كل عناصره ويعيدهم كسلسلة.
[1, 2, 3].toString() // "1,2,3" ['hello', 'world'].toString() // "hello,world"
نظرًا لأن صفيفنا فارغ ، فليس لدينا ما ننضم إليه! وبالتالي...
[].toString() // ""
المواصفات ToPrimitive
تحول هذه المصفوفة الفارغة إلى سلسلة فارغة. المراجع هنا وهنا لراحتك (أو الارتباك).
3. تصبح السلسلة الفارغة 0
لا يمكنك اختلاق هذه الأشياء. الآن بعد أن أجبرنا المصفوفة على ذلك ""
، عدنا إلى الخوارزمية الأولى ...
إذا كانت x عبارة عن رقم وكانت y عبارة عن سلسلة ، فقم بإرجاع x == ToNumber (y)
وذلك ل 0 == ""
بما أن 0 عبارة عن رقم و "" سلسلة ، يتم إرجاع 0 == ToNumber ("")
ToNumber("")
إرجاع 0.
لذلك ، 0 == 0
مرة أخرى ...
لوحة 3 - خلاصة سريعة
هذا صحيح
0 == "0" // true
لأن الإكراه يحول هذا إلى 0 == ToNumber("0")
.
هذا صحيح
0 == [] // true
لأن الإكراه يجري مرتين:
ToPrimitive([])
يعطي سلسلة فارغة- ثم
ToNumber("")
يعطي 0.
إذن أخبرني ... وفقًا للقواعد أعلاه ، ماذا يجب أن يعود هذا؟
"0" == []
لوحة 4 - خطأ!
خاطئة! صيح.
هذا الجزء منطقي إذا فهمت القواعد.
هنا مقارنتنا:
"0" == [] // false
الرجوع إلى المواصفات مرة أخرى:
إذا كانت x عبارة عن سلسلة أو رقم وكانت y هي كائن ، فقم بإرجاع x == ToPrimitive (y)
هذا يعني...
نظرًا لأن "0" عبارة عن سلسلة و [] عبارة عن كائن ، فارجع إلى x == ToPrimitive ([])
ToPrimitive([])
إرجاع سلسلة فارغة. أصبحت المقارنة الآن
"0" == ""
"0"
و ""
كلاهما السلاسل، لذلك يقول جافا سكريبت لا مزيد من القهر حاجة . هذا هو سبب حصولنا false
.
استنتاج
استخدام الثلاثي يساوي والنوم بهدوء في الليل.
0 === "0" // false 0 === [] // false "0" === [] // false
إنه يتجنب الإكراه تمامًا ، لذلك أعتقد أنه أكثر كفاءة أيضًا!
لكن زيادة الأداء تكاد تكون بلا معنى. الفوز الحقيقي هو الثقة المتزايدة التي ستحصل عليها في التعليمات البرمجية الخاصة بك ، مما يجعل ضغط المفتاح الإضافي يستحق ذلك تمامًا.
تريد تدريب مجاني؟
إذا كنت ترغب في تحديد موعد مكالمة مجانية لمدة 15-30 دقيقة لمناقشة أسئلة تطوير الواجهة الأمامية فيما يتعلق بالرمز أو المقابلات أو المهنة أو أي شيء آخر تابعني على Twitter و DM me.
بعد ذلك ، إذا استمتعت باجتماعنا الأول ، فيمكننا مناقشة علاقة التدريب المستمرة التي ستساعدك في الوصول إلى أهداف تطوير الواجهة الأمامية!
شكرا للقراءة
لمزيد من المحتوى مثل هذا ، تحقق من //yazeedb.com!
حتى المرة القادمة!