أفضل ميمي جافا سكريبت رأيته بالتفصيل

TLDR: أرغم نفسك على استخدام يساوي الثلاثي.

لقد وجدت عن غير قصد ميم JavaScript هذا على Reddit ، وهو أفضل ما رأيته على الإطلاق.

أفضل- js-meme-to-date-2

يمكنك التحقق من دقة هذا الميم عن طريق تشغيل كل مقتطف رمز في Developer Tools. النتيجة ليست مفاجئة ، لكنها لا تزال مخيبة للآمال.

بالطبع تقودني هذه التجربة الصغيرة إلى التساؤل ...

لماذا يحدث هذا؟

لماذا يحدث هذا

من خلال الخبرة ، تعلمت تبني جوانب جافا سكريبت الناعمة أثناء التحذير من أشجار الصنوبر الشائكة. ومع ذلك ، فإن تفاصيل هذه القضية الركنية ما زالت تزعجني.

إنه تمامًا كما يقول كايل سيمبسون ...

"لا أعتقد أن أي شخص يعرف JS حقًا ، ليس تمامًا على أي حال."

عندما تظهر هذه الحالات ، فمن الأفضل الرجوع إلى المصدر - مواصفات ECMAScript الرسمية التي تم إنشاء JavaScript منها.

مع وجود المواصفات في متناول اليد ، دعونا نفهم بعمق ما يحدث هنا.

الجلسة الأولى - إدخال الإكراه

لوحة 1-1

إذا كنت تعمل 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 - المصفوفات تتعرض للإكراه أيضًا

لوحة 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() // "" 

مجموعة فارغة تجبر سلسلة فارغة 1

المواصفات ToPrimitiveتحول هذه المصفوفة الفارغة إلى سلسلة فارغة. المراجع هنا وهنا لراحتك (أو الارتباك).

3. تصبح السلسلة الفارغة 0

تصبح السلاسل الفارغة 0

لا يمكنك اختلاق هذه الأشياء. الآن بعد أن أجبرنا المصفوفة على ذلك ""، عدنا إلى الخوارزمية الأولى ...

إذا كانت x عبارة عن رقم وكانت y عبارة عن سلسلة ، فقم بإرجاع x == ToNumber (y)

وذلك ل 0 == ""

بما أن 0 عبارة عن رقم و "" سلسلة ، يتم إرجاع 0 == ToNumber ("")

ToNumber("") إرجاع 0.

لذلك ، 0 == 0مرة أخرى ...

الإكراه في كل مرة 2

لوحة 3 - خلاصة سريعة

لوحة 3-1

هذا صحيح

0 == "0" // true 

لأن الإكراه يحول هذا إلى 0 == ToNumber("0").

هذا صحيح

0 == [] // true 

لأن الإكراه يجري مرتين:

  1. ToPrimitive([]) يعطي سلسلة فارغة
  2. ثم ToNumber("")يعطي 0.

إذن أخبرني ... وفقًا للقواعد أعلاه ، ماذا يجب أن يعود هذا؟

"0" == [] 

لوحة 4 - خطأ!

لوحة 4-1

خاطئة! صيح.

هذا الجزء منطقي إذا فهمت القواعد.

هنا مقارنتنا:

"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!

حتى المرة القادمة!