تصميم لغة JavaScript ليس صارمًا بما فيه الكفاية ، وسوف ترتكب العديد من الأماكن أخطاء إذا لم تكن حذراً.
على سبيل المثال ، النظر في المواقف التالية.
الآن ، نحتاج إلى تحديد ما إذا كان هناك كائن عالمي myobj ، وإذا لم يكن موجودًا ، أعلن ذلك. الخوارزمية الموضحة في اللغة الطبيعية هي كما يلي:
إذا (myobj غير موجود) {DECLARE MYOBJ ؛ }قد تجد أنه من السهل كتابة هذا الرمز. ولكن في الواقع ، فإن القضايا النحوية التي تنطوي عليها أكثر تعقيدًا مما نعتقد. أشار Jurriy Zaytsev إلى أن هناك أكثر من 50 طريقة لتحديد ما إذا كان هناك كائن JavaScript. فقط عندما تكون تفاصيل تنفيذ لغة JavaScript واضحة للغاية ، يمكن تمييزها.
أول طريقة للكتابة
بناءً على حدسك ، قد تعتقد أنه يمكنك كتابة هذا:
if (! myobj) {myobj = {} ؛ }ومع ذلك ، إذا قمت بتشغيل هذا الرمز ، فسيقوم المتصفح بإلقاء خطأ مرجعية مباشرة ، مما يتسبب في مقاطعة العملية. ما هو الخطأ؟
بالمناسبة ، عندما يحدد البيان IF ما إذا كان MyObJ فارغًا ، فإن هذا المتغير غير موجود بعد ، لذلك سيتم الإبلاغ عن خطأ. قم بتغييره إلى ما يلي وسيتم تشغيله بشكل صحيح.
if (! myobj) {var myobj = {} ؛ }لماذا لا يتم الإبلاغ عن الخطأ بعد إضافة VAR؟ هل يوجد بالفعل MyObJ في هذه الحالة عندما يصدر البيان IF الأحكام؟
للإجابة على هذا السؤال ، يجب أن تعرف كيف يعمل مترجم JavaScript. لغة JavaScript هي "تحليل أولاً ، تشغيل لاحقًا". يتم الانتهاء من الإعلان المتغير أثناء التحليل ، وبالتالي فإن الكود أعلاه يعادل في الواقع:
var myobj ؛ if (! myobj) {var myobj = {} ؛ }لذلك ، عندما يصدر البيان if الأحكام ، توجد myobj ، لذلك لا يوجد خطأ. هذا هو تأثير "تعزيز الكود" لأمر VAR. مترجم JavaScript فقط "يرفع" المتغيرات المحددة بواسطة أمر VAR ، ولا يعمل للمتغيرات التي لا تستخدم الأمر VAR وتعيينها مباشرة. هذا هو السبب في أنه سيؤدي إلى خطأ إذا لم تضيف VAR.
الطريقة الثانية للكتابة
بالإضافة إلى أمر VAR ، يمكن أن يكون هناك إعادة كتابة أخرى ويمكنك أيضًا الحصول على النتيجة الصحيحة:
if (! window.myobj) {myobj = {} ؛ }النافذة هي كائن المستوى الأعلى لـ JavaScript ، وجميع المتغيرات العالمية هي خصائصها. لذلك ، فإن الحكم على ما إذا كان MyObJ فارغًا يعادل الحكم على ما إذا كان كائن النافذة يحتوي على سمة MyObJ ، وذلك لتجنب خطأ المرجع لأن MyObJ لم يتم تعريفه. ومع ذلك ، من توحيد الكود ، من الأفضل إضافة VAR إلى السطر الثاني:
if (! window.myobj) {var myobj = {} ؛ }أو اكتبها هكذا:
if (! window.myobj) {window.myobj = {} ؛ }الطريقة الثالثة للكتابة
إن عيب طريقة الكتابة أعلاه هو أنه في بعض بيئات التشغيل (مثل V8 و Rhino) ، قد لا تكون النافذة كائنًا من المستوى الأعلى. لذا ، فكر في إعادة كتابته على النحو التالي:
if (! this.myobj) {this.myobj = {} ؛ }على المستوى العالمي المتغير ، تشير هذه الكلمة الرئيسية دائمًا إلى المتغير الأعلى ، بحيث يمكن أن تكون مستقلة عن بيئات التشغيل المختلفة.
الطريقة الرابعة للكتابة
ومع ذلك ، فإن الكتابة أعلاه غير قابلة للقراءة بشكل سيئ ، وتشير إلى هذا المتغير والمعرضة للخطأ ، لذلك يتم إعادة كتابته بشكل أكبر:
var global = هذا ؛ if (! global.myobj) {global.myobj = {} ؛ }من الواضح كثيرًا استخدام المتغير العالمي المخصص لتمثيل كائن المستوى الأعلى.
الطريقة الخامسة للكتابة
يمكنك أيضًا استخدام مشغل typeof لتحديد ما إذا كان myobj محدد.
if (typeof myobj == "undefined") {var myobj = {} ؛ }هذه هي الطريقة الأكثر استخدامًا على نطاق واسع لتحديد ما إذا كان كائن JavaScript موجودًا.
الطريقة السادسة للكتابة
نظرًا لأن قيمة MyObJ تساوي مباشرةً غير المحددة في حالة المحددة ولكن لم يتم تعيينها ، يمكن تبسيط طريقة الكتابة أعلاه:
if (myobj == undefined) {var myobj = {} ؛ }هناك مكانان يجب ملاحظته هنا. أولاً ، يجب ألا تكون الكلمات الرئيسية VAR على السطر الثاني مفقودة ، وإلا فإن خطأ مرجعية سيحدث. ثانياً ، لا يمكن إضافة غير محدد مع علامات اقتباس مفردة أو مزدوجة ، لأنه يتم مقارنة نوع البيانات غير المحددة هنا ، بدلاً من السلسلة "غير المحددة".
الطريقة السابعة للكتابة
لا تزال طريقة الكتابة أعلاه صالحة في ظل حالة "المقارنة الدقيقة" (===):
if (myobj === undefined) {var myobj = {} ؛ }الطريقة الثامنة للكتابة
وفقًا لتصميم اللغة لـ JavaScript ، غير محدد == NULL ، بحيث يمكنك أيضًا الحصول على النتيجة الصحيحة من خلال مقارنة ما إذا كان MyObj يساوي NULL:
if (myobj == null) {var myobj = {} ؛ }ومع ذلك ، على الرغم من أن نتيجة العملية صحيحة ، بشكل دلالي ، فإن طريقة الحكم هذه خاطئة ويجب تجنبها. نظرًا لأن NULL يشير إلى كائن فارغ تم تعيينه إلى NULL ، أي أن هذا الكائن يقدر بالفعل ، بينما يشير غير محدد إلى كائن غير موجود أو ليس له أي مهمة. لذلك ، يمكنك فقط استخدام "مقارنة المشغل" (==) هنا ، وإذا كنت تستخدم "مشغل المقارنة الدقيق" (===) هنا ، فستحصل على خطأ.
الطريقة التاسعة للكتابة
يمكنك أيضًا استخدام المشغل في لتحديد ما إذا كان MyObj سمة للكائن العالي:
if (! ('myobj' in window)) {window.myobj = {} ؛ }الطريقة العاشرة للكتابة
أخيرًا ، استخدم طريقة HasownProperty لتحديد ما إذا كانت MyObJ خاصية للكائن العالي المستوى:
if (! this.hasownProperty ('myobj')) {this.myobj = {} ؛ }لخص
1. إذا حددت فقط ما إذا كان الكائن موجودًا ، فمن المستحسن استخدام طريقة الكتابة الخامسة.
2. إذا كان الكائن موجودًا بالإضافة إلى ما إذا كان الكائن موجودًا أيضًا ، فمن الضروري أيضًا تحديد ما إذا كان للكائن قيمة فارغة ، فمن المستحسن استخدام طريقة الكتابة الأولى.
3. ما لم ينص على خلاف ذلك ، يجب الإعلان عن جميع المتغيرات باستخدام أمر VAR.
4. بالنسبة للمنصات المتقاطعة ، يوصى بتجنب استخدام نافذة لتمثيل الكائنات ذات المستوى الأعلى.
5. في لغة JavaScript ، لاغية وغير محددة عرضة للارتباك. في الحالات التي قد يشارك فيها كلاهما ، يوصى باستخدام مشغل "المقارنة الدقيقة" (===).
(زيادة)
المثال البسيط أعلاه حول كيفية الحكم على ما إذا كان كائن JavaScript موجود هو كل المحتوى الذي شاركته معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.